2013-04-15 33 views
14

Jestem całkiem nowy dla Pythona, ale nigdzie nie mogłem znaleźć rozwiązania mojego problemu.Zliczanie liczby wystąpień na liście krotek

Chcę policzyć wystąpienia ciągu wewnątrz listy krotek.

Oto lista krotek:

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

Próbowałem tego, ale to po prostu drukuje 0

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

Gdy występuje ten sam identyfikator dwukrotnie na liście, to powinien wrócić:

2 
1 

Próbowałem również zwiększyć licznik dla każdego wystąpienia tego samego identyfikatora, ale nie mogłem w pełni zrozumieć, jak wri to.

* EDYCJA: Korzystanie z niesamowitej odpowiedzi Eumiro. Właśnie zdałem sobie sprawę, że nie wyjaśniłem całego problemu. I rzeczywiście potrzebują całkowitej ilości wpisów, które ma wartość ponad 1. Ale jeśli próbuję robić:

for name, value in list1: 

    if value > 1: 
     print value 

otrzymuję ten błąd:

ValueError: Too many values to unpack 

Odpowiedz

24

Może collections.Counter mogłoby rozwiązać problem:

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

powraca

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

Jest szybki, ponieważ tylko raz wykonuje iterację na liście. Powtarzasz wpisy, a następnie próbujesz uzyskać liczbę tych wpisów na liście. Które nie mogą być wykonane z .count, ale może to zrobić w następujący sposób:

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

Ale poważnie przyjrzeć się collections.Counter.

EDIT: I rzeczywiście potrzebują całkowitej ilości wpisów, które ma większą wartość niż 1.

Można nadal używać Counter:

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

powraca 2, czyli sumy zliczeń, które są wyższe niż 1.

+0

'Licznik' czyni to tak prostym – jamylak

+0

Dzięki! To naprawdę proste! Właśnie zdałem sobie sprawę, że nie wyjaśniłem całego problemu. Zaktualizowałem oryginalne pytanie. – mackwerk

+0

@Mackwerk - zobacz moją zredagowaną odpowiedź. – eumiro

4

list1.count(entry[0]) nie będzie działać, ponieważ wygląda na każdym z thr ee krotki w list1, np. ('12392', 'some string', 'some other string') i sprawdza na przykład, czy są one równe '12392', co oczywiście nie ma miejsca.

@ Odpowiedź eurmiro pokazuje, jak to zrobić z Counter (co jest najlepszym sposobem!), ale tutaj jest wersja biednego człowieka, aby pokazać, jak działa Counter przy użyciu słownika i metody dict.get(k, [,d]), która spróbuje uzyskać klucz (k), ale jeśli nie istnieje, zwraca wartość domyślną (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} 
+0

Fajnie! Całkiem ciekawe, jak to działa :) – mackwerk