2012-12-14 15 views
32

Python itertools ile çalışıyorum ve son öğe tarafından bir çift çift sıralamak için groupby kullanıyorum. Sıralamak için aldım ve gruplar halinde yineleyebilirim, ama her grubun uzunluğunu almak zorunda kalmadan her grubun uzunluğunu elde etmeyi gerçekten çok isterim.Python: Itertools'un uzunluğunu alma _grouper

Proje, bazı veri noktalarını kümelendiriyor. Ben çiftleri ile çalışıyorum (numpy.array, int) numpy dizi veri noktasıdır ve tamsayı küme etiketi

İşte benim alakalı kod nerede: Geçen satırda

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

, 'len (clusterList) < minLen:', 'itertools._grouper' türünde nesnenin len() olmadığı bir hata alıyorum.

_groupers için kullanılabilir olan işlemlere baktım, ancak bir grubun uzunluğunu sağlayabilecek bir şey bulamadım.

+0

Daha iyi yollar olabilir, ancak yinelenebilir listeyi bir listeye dönüştürebilir ve öğeleri sayabilir ('if (list (clusterList)) RocketDonkey

+0

Teşekkürler, RocketDonkey, bu mükemmel çalışıyor! – user1466679

+0

Hiç sorun yok - aşağıdaki yanıtlar aynı çözümü önerir, bu yüzden 'yanıtı' yapmak için bunlardan birini kabul edebilirsiniz. Her şeyde iyi şanslar! – RocketDonkey

cevap

38

Sadece onu aradığınız için clusterList bir liste yapmaz! Temel olarak her öğeyi gereken şekilde döndüren tembel bir yineleyici.

clusterList = list(clusterList) 

Ya bunu ve tek adımda uzunluğunu almak: Gerçi böyle bir liste dönüştürebilirsiniz

length = len(list(clusterList)) 

sen yapma belleği almaya istemiyorsanız bir liste, bunun yerine bunu yapabilirsiniz:

length = sum(1 for x in clusterList) 

orijinal yineleyici ya bir listeye dönüştürerek veya sum() formülasyonu kullanılarak tamamen kül edilecek unutmayın.

1

clusterListiterable ancak list değil. Bu bazen biraz kafa karıştırıcı olabilir. clusterList üzerinden bir for döngü yapabilirsiniz, ancak üzerinde başka bir şey yapamazsınız (dilim, len, vb).

Düzeltme: list(clusterList) sonucunu clusterList olarak atayın.

İlgili konular