如果你取消注释下面的注释行,那么输出将会改变(对于除最后一个键以外的所有键,grouper对象将为空)。这是为什么?
from itertools import groupby
c = groupby(['goat', 'dog', 'cow', 1, 1, 2, 3, 11, 10, ('persons', 'man', 'woman')])
#c = list(c)
dic = {}
for k, v in c:
dic[k] = list(v)
print dic
答案 0 :(得分:2)
摘要:原因是itertools通常不存储数据。他们只使用迭代器。因此,当外迭代器前进时,内迭代器也必须。
打个比方:想象一下,你是一名站在门口的空乘人员,允许单行乘客上飞机。乘客由登机组安排,但您一次只能看到并接纳一名乘客。定期,当人们进入你时,你会知道一个登机组何时结束然后接下来已经开始。
要进入下一组,您将不得不承认当前组中的所有剩余乘客。如果没有让所有现在的乘客通过,你就无法看到下游的内容。
Unix比较: groupby()的设计在算法上类似于Unix uniq实用程序。
文档说的是什么:“返回的组本身就是一个迭代器,它与groupby()共享底层的iterable。因为源是共享的,所以当groupby()对象被提前时,前一个小组不再可见。“
如何使用:如果以后需要数据,则应将其存储为列表:
groups = []
uniquekeys = []
data = sorted(data, key=keyfunc)
for k, g in groupby(data, keyfunc):
groups.append(list(g)) # Store group iterator as a list
uniquekeys.append(k)