在调用`list`两次时,group在`itertools.groupby`中消失

时间:2018-05-23 09:10:26

标签: python python-3.x iterator list-comprehension

我尝试使用以下代码在Python中创建run-len-encoding

from itertools import groupby
a = [0,0,0,1,1,0,1,0,1, 1, 1]
[list(g) for k, g in groupby(a)]
## [[0, 0, 0], [1, 1], [0], [1], [0], [1, 1, 1]]

但是当我将g放入if语句时,它会消失

[list(g) if len(list(g)) > 0 else 0 for k, g in groupby(a)]
## [[], [], [], [], [], []]
另一方面,

k似乎不受if声明的影响

[k if k > 0 and k == 1 else 0 for k, g in groupby(a)]
## [0, 1, 0, 1, 0, 1]

我需要使用g语句提取if,以便我将来尝试做某些事情,例如,

import numpy as np
[list(np.repeat(1, len(list(g)))) if len(list(g)) > 1 and k == 1 else list(np.repeat(0, len(list(g)))) for k, g in groupby(a)]

所以我的问题是它为什么会发生(对Python来说是新的)并且存在(我确信有)要克服这个问题

修改

这与问题本身没有直接关系,但我最终在rle/inverse.rle

中使用for循环构建了我的groupby
def rle (a):
    indx = 0
    for k, g in groupby(a):
        g_len = len(list(g))
        if g_len == 1 and k == 1:
            a[indx:(indx + g_len)] = [0]
        indx += g_len

1 个答案:

答案 0 :(得分:1)

我们举一个最小的例子:

def a():
    for i in range(10):
        yield i

b = a()
print(list(b))
print(list(b))

输出:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[]

所以你可以看到你只能在生成器上调用list一次。您需要先将list(g)分配给变量。