2012-12-14 12 views
32

bekommen Ich arbeite mit Python itertools und mit groupby eine Reihe von Paaren, die durch das letzte Element zu sortieren. Ich habe es bekommen zu sortieren, und ich kann ganz gut durch die Gruppen durchlaufen, aber ich würde wirklich lieben, die Länge jeder Gruppe erhalten zu können, ohne durch jeden zu durchlaufen haben, einen Zähler erhöht wird.Python: Wie die Länge der itertools _grouper

Das Projekt ist es, einige Datenpunkte gruppieren. Ich arbeite mit Paaren (numpy.array, int), wo die numpy Array ein Datenpunkt ist und die ganze Zahl ist ein Cluster-Label

Hier ist mein entsprechender Code:

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

In der letzten Zeile, 'wenn Len (clusterList) < MinLen:' ich erhalte eine Fehlermeldung, dass das Objekt vom Typ 'itertools._grouper' keine len hat().

Ich habe die Operationen für _groupers nachgeschlagen, kann aber nichts finden, dass die Länge einer Gruppe zur Verfügung zu stellen scheint.

+0

Möglicherweise gibt es bessere Möglichkeiten, aber Sie können das iterable in eine Liste konvertieren und die Elemente zählen ('if len (list (clusterList)) RocketDonkey

+0

Danke, RocketDonkey, das funktioniert perfekt! – user1466679

+0

Kein Problem - die Antworten unten deuten auf die gleiche Lösung hin, so dass Sie eine davon akzeptieren können, um sie zur "Antwort" zu machen. Viel Glück mit allem! – RocketDonkey

Antwort

38

Nur weil Sie nennen es clusterList macht es nicht eine Liste! Es ist im Grunde ein fauler Iterator, der jedes Element so zurückgibt, wie es benötigt wird. Sie können es auf eine Liste wie folgt konvertieren, aber:

clusterList = list(clusterList) 

Oder das tun und seine Länge in einem Schritt erhalten:

length = len(list(clusterList)) 

Wenn Sie den Speicher nicht in Anspruch nehmen wollen machen es sich um eine Liste, können Sie diese stattdessen tun:

length = sum(1 for x in clusterList) 

beachten Sie, dass die ursprüngliche Iterator vollständig verbraucht wird, indem sie entweder auf eine Liste oder mit der sum() Formulierung umwandelt.

1

clusterList ist iterable aber es ist kein list. Dies kann manchmal etwas verwirrend sein. Sie können eine for Schleife über clusterList machen, aber Sie können andere Liste Sachen nicht darüber machen (Scheibe, len, usw.).

Fix: weisen Sie das Ergebnis list(clusterList) der clusterList zu.

Verwandte Themen