Aby zilustrować, zacznę z listy 2-krotek:Jak używać itertools.groupby, gdy klucz jest w elementach 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]
Wynik:
1 one
2 two
1 one
3 three
2 two
W próbie zbadania dlaczego:
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')]
Mimo to da mnie ta sama moc wyjściowa:
for key, grp in itertools.groupby(raw, key=operator.itemgetter(0)):
print key, list(grp)
chcę uzyskać coś takiego:
1 one, one
2 two, two
3 three
myślę to dlatego, że klucz jest w krotce wewnątrz listy, podczas gdy w rzeczywistości krotka dostaje przemieszczać jako jeden. Czy istnieje sposób, aby uzyskać pożądany wynik? Może groupby()
nie nadaje się do tego zadania?
Myślałem 'grp' jest' itertool._grouper' przedmiot. Jakie inne rodzaje działań 'wbudowanych' mogę zrobić z' _grouper'? Widzę, że potraktowałeś to również jako "iterable"? Schludny! – Kit
@Kit: Wierzę, że głównym pożytecznym faktem na temat 'grp' jest to, że jest to' iterable'. Dopóki tego nie wspomniałeś, nie wiedziałem, że to obiekt 'itertools._grouper'. Wydaje się to być dobrym przykładem wygody pisania na kaczkach. Nie musimy znać typu 'grp', tylko że implementuje interfejs' iterable'. – unutbu
+1 dla 'itemgetter' – Krastanov