爲了說明這一點,我開始用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'做些什麼'builtin'動作?我看到你把它當作一個'iterable'來對待?整齊! – Kit 2010-08-09 13:52:20
@Kit:我認爲關於'grp'的主要有用的事實是它是一個'iterable'。在你提到它之前,我不知道它是一個'itertools._grouper'對象。這似乎是鴨式打字便利的一個很好的例子。我們不需要知道'grp'的類型,只需要它實現'iterable'接口。 – unutbu 2010-08-09 18:18:37
+1''itemgetter' – Krastanov 2013-03-30 14:35:48