2013-04-15 20 views
14

Sono abbastanza nuovo per Python, ma non sono stato in grado di trovare una soluzione al mio problema da nessuna parte.Conteggio della quantità di occorrenze in un elenco di tuple

Voglio contare le occorrenze di una stringa all'interno di un elenco di tuple.

Ecco la lista di tuple:

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

Ho provato questo, ma si limita a stampare 0

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

Come si verifica lo stesso ID due volte nella lista, questo dovrebbe restituire:

2 
1 

Ho anche provato ad incrementare un contatore per ogni occorrenza dello stesso ID ma non riuscivo a capire bene come te

* MODIFICA: Utilizzando la straordinaria risposta di Eumiro. Mi sono appena reso conto che non ho spiegato l'intero problema. ho effettivamente bisogno la quantità totale di voci che ha un valore superiore a 1. Ma se provo a fare:

for name, value in list1: 

    if value > 1: 
     print value 

ottengo questo errore:

ValueError: Too many values to unpack 

risposta

24

Forse collections.Counter potrebbe risolvere il problema:

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

rendimenti

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

È veloce dato che itera sulla tua lista solo una volta. Si scorre le voci e quindi si tenta di ottenere un conteggio di queste voci all'interno del proprio elenco. Questo non può essere fatto con .count, ma potrebbe essere fatto come segue:

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

Ma seriamente, dare un'occhiata a collections.Counter.

EDIT: ho effettivamente bisogno la quantità totale di voci che ha un valore di più di 1.

è comunque possibile utilizzare le Counter:

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

rendimenti 2, vale a dire la somma di conteggi superiori a 1.

+0

'Counter' lo rende così semplice – jamylak

+0

Grazie! È davvero semplice! Mi sono appena reso conto che non ho spiegato l'intero problema. Ho aggiornato la domanda originale. – mackwerk

+0

@Mackwerk - guarda la mia risposta modificata. – eumiro

4

list1.count(entry[0]) non funziona perché guarda a ciascuno dei tre e tuple in list1, ad es. ('12392', 'some string', 'some other string') e controlla se sono uguali a '12392' per esempio, che ovviamente non è il caso.

La risposta di @ eurmiro mostra come farlo con Counter (che è il modo migliore!) ma qui è la versione di un uomo povero per illustrare come funziona Counter utilizzando un dizionario e il metodo dict.get(k, [,d]) che tenterà di ottenere una chiave(), ma se non esiste restituisce invece il valore predefinito (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

Cool! Piuttosto interessante vedere come funziona :) – mackwerk

Problemi correlati