在groupby周围列出会导致空组
我在玩耍以获得更好的itertools感觉groupby
,所以我按数字对元组列表进行了分组,并试图得到结果组的列表。groupby
但是,当我将结果转换为列表时,会得到一个奇怪的结果:除了最后一组以外的所有内容都是空的。这是为什么?我以为将迭代器转换为列表效率不高,但永远不会改变行为。我猜列表是空的,因为遍历了内部迭代器,但是何时/何地发生?
import itertools
l=list(zip([1,2,2,3,3,3],['a','b','c','d','e','f']))
#[(1, 'a'), (2, 'b'), (2, 'c'), (3, 'd'), (3, 'e'), (3, 'f')]
grouped_l = list(itertools.groupby(l, key=lambda x:x[0]))
#[(1, <itertools._grouper at ...>), (2, <itertools._grouper at ...>), (3, <itertools._grouper at ...>)]
[list(x[1]) for x in grouped_l]
[[], [], [(3, 'f')]]
grouped_i = itertools.groupby(l, key=lambda x:x[0])
#<itertools.groupby at ...>
[list(x[1]) for x in grouped_i]
[[(1, 'a')], [(2, 'b'), (2, 'c')], [(3, 'd'), (3, 'e'), (3, 'f')]]
-
返回的组本身就是一个与共享底层可迭代对象的迭代器
groupby()
。因为源是共享的,所以当groupby()
对象前进时,先前的组将不再可见。将输出从
groupby()
转换为列表将使groupby()
对象前进。
因此,您不应该将类型转换
itertools.groupby
对象列出。如果要将值存储为list
,则应执行以下 列表理解操作
以创建groupby
对象的副本:grouped_l = [(a, list(b)) for a, b in itertools.groupby(l, key=lambda x:x[0])]
这将允许您多次迭代列表 (从
groupby
对象转换)。但是,如果您只对结果进行一次迭代感兴趣,那么您在问题中提到的第二个解决方案就可以满足您的要求。