Pour illustrer, je commence par une liste de 2-tuples:Comment utiliser itertools.groupby lorsque la valeur de clé est dans les éléments de l'itérable?
import itertools
import operator
raw = [(1, "one"),
(2, "two"),
(1, "one"),
(3, "three"),
(2, "two")]
for key, grp in itertools.groupby(raw, key=lambda item: item[0]):
print key, list(grp).pop()[1]
rendements:
1 one
2 two
1 one
3 three
2 two
Pour tenter de déterminer pourquoi:
for key, grp in itertools.groupby(raw, key=lambda item: item[0]):
print key, list(grp)
# ---- OUTPUT ----
1 [(1, 'one')]
2 [(2, 'two')]
1 [(1, 'one')]
3 [(3, 'three')]
2 [(2, 'two')]
Même cela me donnera la même sortie:
for key, grp in itertools.groupby(raw, key=operator.itemgetter(0)):
print key, list(grp)
Je veux obtenir quelque chose comme:
1 one, one
2 two, two
3 three
Je pense que c'est parce que la clé est dans le tuple dans la liste, alors que le tuple est déplacé autour comme un. Y a-t-il un moyen d'atteindre la sortie désirée? Peut-être que groupby()
ne convient pas à cette tâche?
Je pensais que 'grp' est un objet' itertool._grouper'. Quels autres types d'actions 'builtin' puis-je faire avec un _grouper'? Je vois que vous l'avez traité comme un itérable? Soigné! – Kit
@Kit: Je crois que le principal fait utile à propos de 'grp' est que c'est un' itérable '. Jusqu'à ce que vous le mentionniez, je ne savais pas que c'était un objet 'itertools._grouper'. Cela semble être un bon exemple de la commodité de la dactylographie. Nous n'avons pas besoin de connaître le type de 'grp', seulement qu'il implémente l'interface' iterable'. – unutbu
+1 pour le 'itemgetter' – Krastanov