2012-12-14 14 views
32

Sto lavorando con Python itertools e utilizzo groupby per ordinare un gruppo di coppie dall'ultimo elemento. L'ho ottenuto per ordinare e posso scorrere i gruppi in modo corretto, ma mi piacerebbe davvero essere in grado di ottenere la lunghezza di ogni gruppo senza dover iterare attraverso ciascuno, incrementando un contatore.Python: come ottenere la lunghezza di itertools _grouper

Il progetto è in cluster alcuni punti dati. Sto lavorando con coppie di (numpy.array, int) dove la matrice NumPy è un punto di dati e il numero intero è un'etichetta gruppo

Ecco il mio codice rilevante:

data = sorted(data, key=lambda (point, cluster):cluster) 
for cluster,clusterList in itertools.groupby(data, key=lambda (point, cluster):cluster): 
    if len(clusterList) < minLen: 

Sull'ultima riga, 'if len (clusterList) < minLen:', ottengo un errore che l'oggetto di tipo 'itertools._grouper' non ha len().

Ho cercato le operazioni disponibili per _groupers, ma non riesco a trovare nulla che sembra fornire la lunghezza di un gruppo.

+0

Ci possono essere modi migliori, ma è possibile convertire l'iterabile in una lista e contare gli elementi ('if len (list (clusterList)) RocketDonkey

+0

Grazie, RocketDonkey, che funziona perfettamente! – user1466679

+0

Nessun problema - le risposte sottostanti suggeriscono la stessa soluzione, quindi puoi accettarne una per renderla 'la risposta'. Buona fortuna per tutto! – RocketDonkey

risposta

38

Solo perché lo chiami clusterList non ne fa una lista! È fondamentalmente un iteratore pigro, restituendo ogni elemento come è necessario. È possibile convertirlo in una lista come questa, però:

clusterList = list(clusterList) 

O farlo e ottenere la sua lunghezza in un unico passaggio:

length = len(list(clusterList)) 

Se non si vuole prendere la memoria di rendere è una lista, si può fare questo, invece:

length = sum(1 for x in clusterList) 

essere consapevoli che l'iteratore originale sarà consumato interamente da uno convertirlo in un elenco o utilizzando la formulazione sum().

1

clusterList è iterable ma non è un list. Questo può essere un po 'di confusione a volte. È possibile eseguire un ciclo for su clusterList ma non è possibile eseguire altre operazioni di elenco (slice, len, ecc.).

Correzione: assegnare il risultato di list(clusterList) a clusterList.

Problemi correlati