Para ilustrar, comienzo con una lista de 2-tuplas:Cómo usar itertools.groupby cuando el valor de la clave está en los elementos de iterable?
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]
rendimientos:
1 one
2 two
1 one
3 three
2 two
En un intento de investigar por qué:
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')]
Incluso esto me dará la misma salida:
for key, grp in itertools.groupby(raw, key=operator.itemgetter(0)):
print key, list(grp)
quiero conseguir algo como:
1 one, one
2 two, two
3 three
estoy pensando que esto se debe a que la clave está dentro de la tupla dentro de la lista, cuando en realidad la tupla se movió alrededor como uno. ¿Hay alguna manera de llegar a mi salida deseada? Tal vez groupby()
no es adecuado para esta tarea?
pensé 'grp' es un objeto' itertool._grouper'. ¿Qué otros tipos de acciones 'integradas' puedo hacer con un '_grouper'? Veo que lo trataste como un "iterable" también? ¡Ordenado! – Kit
@Kit: Creo que el principal hecho útil sobre 'grp' es que es un' iterable'. Hasta que lo mencionó, no sabía que era un objeto 'itertools._grouper'. Esto parece ser un buen ejemplo de la conveniencia de escribir patos. No necesitamos saber el tipo de 'grp', solo que implementa la interfaz' iterable'. – unutbu
+1 para 'itemgetter' – Krastanov