web-dev-qa-db-fra.com

Python: comment obtenir la longueur d'itertools _grouper

Je travaille avec Python itertools et j'utilise groupby pour trier un tas de paires par le dernier élément. Je l'ai fait pour trier et je peux parcourir les groupes très bien, mais je le ferais J'adore vraiment pouvoir obtenir la longueur de chaque groupe sans avoir à parcourir chacun d'eux, en incrémentant un compteur.

Le projet consiste à regrouper certains points de données. Je travaille avec des paires de (numpy.array, int) où le tableau numpy est un point de données et l'entier est une étiquette de cluster

Voici mon code pertinent:

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

Sur la dernière ligne: if len(clusterList) < minLen:, j'obtiens une erreur

l'objet de type 'itertools._grouper' n'a pas de len ()

J'ai recherché les opérations disponibles pour _groupers, Mais je ne trouve rien qui semble fournir la longueur d'un groupe.

38
user1466679

Le fait que vous l'appeliez clusterList n'en fait pas une liste! Il s'agit essentiellement d'un itérateur paresseux, renvoyant chaque élément selon les besoins. Vous pouvez cependant le convertir en une liste comme celle-ci:

clusterList = list(clusterList)

Ou faites-le et obtenez sa longueur en une seule étape:

length = len(list(clusterList))

Si vous ne voulez pas occuper la mémoire d'en faire une liste, vous pouvez le faire à la place:

length = sum(1 for x in clusterList)

N'oubliez pas que l'itérateur d'origine sera entièrement consommé en le convertissant en liste ou en utilisant la formulation sum().

49
kindall

clusterList est iterable mais ce n'est pas un list. Cela peut parfois être un peu déroutant. Vous pouvez faire une boucle for sur clusterList mais vous ne pouvez pas faire d'autres choses de liste dessus (tranche, len, etc.).

Correction: affectez le résultat de list(clusterList) à clusterList.

3
Brian Cain