小能豆

python 2 奇怪的列表理解行为

py

我查看了列表推导并发现了一些奇怪的东西。代码:

a = ['a', 'a', 'a', 'b', 'd', 'd', 'c', 'c', 'c']
print [(len(list(g)), k) if len(list(g)) > 1 else k for k, g in groupby(a)]

结果:

[(0, 'a'), 'b', (0, 'd'), (0, 'c')]

但我想看到:

[(3, 'a'), 'b', (2, 'd'), (3, 'c')]

这种行为的原因是什么?


阅读 18

收藏
2024-11-15

共1个答案

小能豆

当你调用list()一个itertools._grouper对象时,你就耗尽了该对象。由于你执行了两次,所以第二次调用会导致长度为 0。

第一的:

if len(list(g))

现在它已经筋疲力尽了。然后:

(len(list(g)), k))

它的长度为 0。

您可以在list理解中嵌套一个生成器/理解,以穷尽对象并在处理之前保存相关数据:

>>> [(y,x) if y>1 else x for x,y in ((k, len(list(g))) for k, g in groupby(a))]
[(3, 'a'), 'b', (2, 'd'), (3, 'c')]
2024-11-15