为啥将 groupby 转换为列表时 groupby 分组会发生变化? [复制]
Posted
技术标签:
【中文标题】为啥将 groupby 转换为列表时 groupby 分组会发生变化? [复制]【英文标题】:Why do the groupby groupings change when you convert groupby to a list? [duplicate]为什么将 groupby 转换为列表时 groupby 分组会发生变化? [复制] 【发布时间】:2018-02-22 23:53:19 【问题描述】:如果您取消注释下面的注释行,则输出将更改(对于除最后一个键之外的所有键,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
【问题讨论】:
不错的答案:***.com/questions/48475888/… @Javier 这是个问题。 我不知道如何参考答案。我的意思是那个问题中公认的答案。 @Javier Baw... 我希望你的意思是 my 在那里回答。在每个答案下,您都可以点击“分享”以获取该答案的链接。 谢谢!实际上,我做到了:***.com/a/48476719/3339058 【参考方案1】:总结:原因是itertools一般不存储数据。他们只是消耗一个迭代器。所以当外层迭代器前进时,内层迭代器也必须前进。
类比:假设您是一名空姐,站在门口,让单线乘客登上飞机。乘客按登机组安排,但您一次只能看到和接纳一名。定期地,当人们进入时,您会知道一个寄宿组何时结束,然后下一个开始。
要进入下一组,您必须接纳当前组中的所有剩余乘客。如果不让所有当前的乘客通过,您就无法看到下游排队的情况。
Unix 比较:groupby() 的设计在算法上类似于 Unix uniq 实用程序。
文档说的是:“返回的组本身就是一个迭代器,它与 groupby() 共享底层迭代器。由于源是共享的,当 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)
【讨论】:
以上是关于为啥将 groupby 转换为列表时 groupby 分组会发生变化? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Intellij Idea 建议在使用循环将数组转换为 Set 时创建中间列表?