it-swarm.com.de

Zählen der Anzahl der Vorkommen in einer Liste von Tupeln

Ich bin relativ neu in Python, aber ich habe nirgendwo eine Lösung für mein Problem gefunden.

Ich möchte die Vorkommen einer Zeichenfolge in einer Liste von Tupeln zählen.

Hier ist die Liste der Tupel:

list1 = [
         ('12392', 'some string', 'some other string'),
         ('12392', 'some new string', 'some other string'),
         ('7862', None, 'some other string')
        ]

Ich habe es versucht, aber es wird nur 0 ausgegeben

for entry in list1:
    print list1.count(entry[0])

Da dieselbe ID zweimal in der Liste vorkommt, sollte Folgendes zurückgegeben werden:

2
1

Ich habe auch versucht, für jedes Vorkommen derselben ID einen Zähler zu erhöhen, konnte aber nicht ganz genau wissen, wie sie geschrieben werden sollte.

* EDIT: Eumiros beeindruckende Antwort verwenden. Ich habe gerade gemerkt, dass ich das ganze Problem nicht erklärt habe ... Ich brauche tatsächlich die Gesamtzahl der Einträge, die einen Wert von mehr als 1 haben. 

for name, value in list1:

    if value > 1:
        print value

Ich erhalte diesen Fehler:

ValueError: Too many values to unpack
18
mackwerk

Möglicherweise könnte collections.Counter Ihr Problem lösen:

from collections import Counter
Counter(elem[0] for elem in list1)

kehrt zurück

Counter({'12392': 2, '7862': 1})

Es ist schnell, da es Ihre Liste nur einmal durchläuft. Sie iterieren über Einträge und versuchen dann, die Anzahl dieser Einträge in Ihrer Liste zu ermitteln. Das kann nicht mit .count gemacht werden, könnte aber wie folgt erfolgen:

for entry in list1:
    print sum(1 for elem in list1 if elem[0] == entry[0])

Aber im Ernst, schau dir collections.Counter an.

EDIT: Ich benötige tatsächlich die Gesamtzahl der Einträge, deren Wert mehr als 1 beträgt.

Sie können die Counter weiterhin verwenden:

c = Counter(elem[0] for elem in list1)
sum(v for k, v in c.iteritems() if v > 1)

gibt 2 zurück, d. h. die Summe der Zählungen, die höher als 1 sind.

30
eumiro

list1.count(entry[0]) funktioniert nicht, da jedes der drei Tupel in list1 betrachtet wird, z. ('12392', 'some string', 'some other string') und prüft, ob sie beispielsweise gleich '12392' sind, was offensichtlich nicht der Fall ist.

@ eurmiros Antwort zeigt Ihnen, wie Sie dies mit Counter tun (was der beste Weg ist!), aber hier ist eine schlechte Version, um zu zeigen, wie Counter mit einem Wörterbuch und der dict.get(k, [,d])-Methode funktioniert, die versucht, einen Schlüssel (k) zu erhalten Wenn es nicht existiert, gibt es stattdessen den Standardwert zurück (d):

>>> list1 = [
         ('12392', 'some string', 'some other string'),
         ('12392', 'some new string', 'some other string'),
         ('7862', None, 'some other string')
]
>>> d = {}
>>> for x, y, z in list1:
        d[x] = d.get(x, 0) + 1


>>> d
{'12392': 2, '7862': 1}
4
jamylak

Ich brauchte einige zusätzliche Funktionen, die Counter nicht hatte. Ich habe eine Liste von Tupeln, bei denen das erste Element der Schlüssel und das zweite Element der Betrag ist, der hinzugefügt werden soll. @jamylak Lösung war eine großartige Anpassung dafür!

>>> list = [(0,5), (3,2), (2,1), (0,2), (3,4)]

>>> d = {}
>>> for x, y in list1:
    d[x] = d.get(x, 0) + y

>>> d
{0: 7, 2: 1, 3: 6}
0
Mosqueteiro