2012-12-14 12 views
32

Pracuję z itertools Python i przy użyciu groupby sortowania grupy par przez ostatni element. Zrobiłem to, aby sortować i mogę przejrzeć grupy, ale dobrze byłoby móc uzyskać długość każdej grupy bez konieczności powtarzania każdego z nich, zwiększając licznik.Python: Jak uzyskać długość itertools _grouper

Projekt jest skupiony w kilka punktów danych. Pracuję z parami (numpy.array, int), gdzie numpy tablicy jest punkt danych i liczba całkowita jest etykietą klastra

Oto mój odpowiedni kod:

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

W ostatnim wierszu "jeśli len (clusterList) < minLen:", pojawia się błąd, że obiekt typu "itertools._grouper" nie ma len().

Sprawdziłem dostępne operacje dla _grouperów, ale nie mogę znaleźć niczego, co wydaje się zapewniać długość grupy.

+0

Możliwe, że istnieją lepsze sposoby, ale możesz przekonwertować plik iterowalny na listę i policzyć elementy ('if len (list (clusterList)) RocketDonkey

+0

Dzięki, RocketDonkey, który działa idealnie! – user1466679

+0

Nie ma problemu - poniższe odpowiedzi sugerują tę samą poprawkę, więc możesz zaakceptować jedną z nich, aby była "odpowiedzią". Powodzenia ze wszystkim! – RocketDonkey

Odpowiedz

38

Tylko dlatego, że nazywasz to clusterList, nie tworzy listy! Jest to w zasadzie leniwy iterator, zwracający każdy element, jaki jest potrzebny. można przekonwertować go na liście, jak ten, choć:

clusterList = list(clusterList) 

Albo zrobić i dostać jego długość w jednym kroku:

length = len(list(clusterList)) 

Jeśli nie chcą zająć pamięć podejmowania to lista, można to zrobić w zamian:

length = sum(1 for x in clusterList) 

należy pamiętać, że oryginalny iterator będą spożywane w całości albo przez przekształcenie go do listy lub z zastosowaniem preparatu sum().

1

clusterList to iterable, ale nie jest to list. Czasami może to być trochę mylące. Możesz wykonać pętlę for przez clusterList, ale nie możesz robić innych rzeczy na liście (plaster, len itp.). Naprawiono: przypisano wynik list(clusterList) do clusterList.

Powiązane problemy