将groupby转换为列表时,为什么groupby分组会发生变化?

时间:2018-02-22 23:53:19

标签: python iterator grouping itertools uniq

如果你取消注释下面的注释行,那么输出将会改变(对于除最后一个键以外的所有键,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

1 个答案:

答案 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)