Для иллюстрации, я начинаю со списком 2-кортежей:Как использовать itertools.groupby, когда значение ключа находится в элементах итерабельного?
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]
урожайности:
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)
# ---- OUTPUT ----
1 [(1, 'one')]
2 [(2, 'two')]
1 [(1, 'one')]
3 [(3, 'three')]
2 [(2, 'two')]
Даже это даст мне тот же выход:
for key, grp in itertools.groupby(raw, key=operator.itemgetter(0)):
print key, list(grp)
Я хочу, чтобы получить что-то вроде:
1 one, one
2 two, two
3 three
Я думаю это потому, что ключ находится в кортеже внутри списка, когда на самом деле кортеж получает перемещаются как единое целое. Есть ли способ достичь желаемого результата? Может быть groupby()
не подходит для этой задачи?
Я думал, что 'grp' является' itertool._grouper' объект. Какие еще «встроенные» действия можно сделать с помощью «_grouper»? Я вижу, что вы рассматривали его как «итерируемый»? Ухоженная! – Kit
@Kit: Я считаю, что основным полезным фактом о 'grp' является то, что он является« итерируемым ». Пока вы не упомянули об этом, я не знал, что это объект 'itertools._grouper'. Это, по-видимому, хороший пример удобства утиной печати. Нам не нужно знать тип 'grp', только он реализует интерфейс' iterable'. – unutbu
+1 для 'itemgetter' – Krastanov