我有一个包含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]
但这对我来说有点过于复杂
答案 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,因此不会发生此异常。