python - itertools groupby 对象未正确输出

标签 python iterator grouping python-itertools

我试图使用 itertools.groupby 来帮助我按正或负属性对整数列表进行分组,例如:

输入

[1,2,3, -1,-2,-3, 1,2,3, -1,-2,-3] 

会回来

[[1,2,3],[-1,-2,-3],[1,2,3],[-1,-2,-3]]

但是如果我:

import itertools

nums = [1,2,3, -1,-2,-3, 1,2,3, -1,-2,-3]
group_list = list(itertools.groupby(nums, key=lambda x: x>=0))
print(group_list)
for k, v in group_list:
    print(list(v))
>>>
[]
[-3]
[]
[]

但如果我不list() groupby 对象,它会正常工作:

nums = [1,2,3, -1,-2,-3, 1,2,3, -1,-2,-3]
group_list = itertools.groupby(nums, key=lambda x: x>=0)
for k, v in group_list:
    print(list(v))
>>>
[1, 2, 3]
[-1, -2, -3]
[1, 2, 3]
[-1, -2, -3]

我不明白的是,一个groupby对象是由一对key和_grouper对象组成的迭代器,一个groupby的list()调用对象不应使用 _grouper 对象?

即使它确实消耗了,我是如何从第二个元素中获取 [-3] 的?

最佳答案

根据 the docs ,明确指出,推进 groupby 对象会使前一个组不可用(实际上是空的):

The returned group is itself an iterator that shares the underlying iterable with groupby(). Because the source is shared, when the groupby() object is advanced, the previous group is no longer visible. So, if that data is needed later, it should be stored as a list.

基本上,不是直接使用 list 构造函数对 list 进行验证,而是需要一个将组迭代器转换为 list 的 listcomp s 在推进 groupby 对象之前,替换:

group_list = list(itertools.groupby(nums, key=lambda x: x>=0))

与:

group_list = [(k, list(g)) for k, g in itertools.groupby(nums, key=lambda x: x>=0)]

大多数 itertools 模块类型的设计旨在避免隐式存储数据,因为它们旨在用于潜在的巨大输入。如果所有的石斑鱼都存储了来自输入的所有数据的副本(并且 groupby 对象必须确保追溯填充它们),它会变得丑陋,并且可能会意外地破坏内存。根据 Python 的禅宗,通过强制您显式存储值,您不会无意中存储无限量的数据:

Explicit is better than implicit.

关于python - itertools groupby 对象未正确输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48655138/

相关文章:

C++ 迭代器和反向迭代器

Java从多次存在的config.properties文件中获取某个属性

javascript - 如何在 javascript 中对这个对象数组进行分组或合并?

opencv - 代表线的分组点

java - 基于 2 个对象对列表中的元素进行分组,如果它们具有相同的值,则仅显示该元素一次,并显示计数

java - 如何按优先级迭代?

python - 生成器、yield、发送 python

python - 计算图像在屏幕上出现的次数

python - 无效语法错误 : Building decision tree with Python and Spark, 流失预测

python - 如何使用Python请求设置媒体类型?