Per illustrare, comincio con un elenco di 2-tuple:Come usare itertools.groupby quando il valore della chiave è negli elementi del iterabile?
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]
rendimenti:
1 one
2 two
1 one
3 three
2 two
Nel tentativo di indagare il motivo per cui:
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')]
Anche questo mi darà la stessa uscita:
for key, grp in itertools.groupby(raw, key=operator.itemgetter(0)):
print key, list(grp)
voglio ottenere qualcosa di simile:
1 one, one
2 two, two
3 three
Sto pensando questo è perché la chiave è all'interno della tupla all'interno della lista, quando in realtà la tupla viene spostato intorno come uno. C'è un modo per arrivare alla mia uscita desiderata? Forse groupby()
non è adatto per questa attività?
ho pensato 'grp' è un oggetto' itertool._grouper'. Quali altri tipi di azioni 'incorporate 'posso fare con' _grouper'? Vedo che l'hai trattato come un 'iterable' pure? Neat! – Kit
@Kit: Credo che il principale fatto utile su 'grp' è che è un' iterable'. Finché non l'hai menzionato, non sapevo che fosse un oggetto "itertools._grouper'. Questo sembra essere un buon esempio della praticità della tipizzazione delle anatre. Non abbiamo bisogno di conoscere il tipo di 'grp', solo che implementa l'interfaccia' iterable'. – unutbu
+1 per 'itemgetter' – Krastanov