使用布尔值列表展开列表

时间:2018-04-26 23:32:59

标签: python

我有一个包含N个元素的列表和一个包含N个Trues的布尔值列表

a = [10,200]
ind = [False, True, False, True, False]

我想将 a 的元素放入 b 列表 ind 作为索引,结果为

b = [0, 10, 0, 200, 0]

有没有办法以高效且易读的方式这样做?

我能做到这一点的最好方法是做

positions = [i for (i,test) in zip(range(len(i)),i) if test]
for i in range(len(positions)):
    b[position[i]] = a[i] 

但这对我来说有点过于复杂

1 个答案:

答案 0 :(得分:3)

由于您的列表中包含N个元素和N True,因此使用迭代器非常有用。您可以使用iter()函数将列表转换为迭代器。

a = iter([10,200])
ind = [False, True, False, True, False]

现在,您可以使用简单的列表理解来获得所需的结果。此列表推导将使用迭代器中的下一个值替换True,并将False替换为0:

final = [next(a) if i else 0 for i in ind]

结果是:

[0, 10, 0, 200, 0]

调用next(a)将继续从迭代器中获取值,此时它将引发StopIteration异常。但是,由于您有相同数量的元素和True' s,因此不会发生此异常。