我有一个值列表,需要根据布尔值列表中的值进行过滤:
list_a = [1, 2, 4, 6]
filter = [True, False, True, False]
我生成了一个新的过滤列表,包含以下行:
filtered_list = [i for indx,i in enumerate(list_a) if filter[indx] == True]
这导致:
print filtered_list
[1,4]
这条线很好用,但(在我看来)有点矫枉过正,我想知道是否有更简单的方法来实现同样的效果。
建议
下面是对两个好建议的总结:
1-不要像我那样将列表命名为filter
,因为它是一个内置函数。
2-不要像我对if filter[idx]==True..
那样拿True
做比较,因为这是不必要的,使用if filter[idx]
就足够了。
7条答案
按热度按时间d4so4syb1#
您正在查找
itertools.compress
:时间比较(py3.x):
不要使用
filter
作为变量名,它是一个内置函数。cs7cruho2#
就像这样:
使用
zip
是一种 * pythonic * 方式,可以并行迭代多个序列,而不需要任何索引。这里假设两个序列具有相同的长度(zip在最短的运行结束后停止)。对于这样一个简单的情况,使用itertools
有点矫枉过正...在你的例子中,有一件事是你应该停止做的,那就是把事情和True比较,这通常是不必要的。你可以简单地写
if filter[idx]: ...
来代替if filter[idx]==True: ...
。k10s72fa3#
伴麻木:
如果list_a可以是numpy数组而不是filter,请参阅Alex Szatmary的答案
Numpy通常也会给你带来很大的速度提升
ccrfmcuu4#
要使用numpy(例如,如果有一个数组
a
而不是list_a
)执行此操作:ff29svar5#
ljo96ir56#
可能不太优雅,但我认为这个解决方案的语法更简单。我将
filter
重命名为filter_
,以避免与内置函数冲突:这里的解决方案:
或在一行中:
slsn1g297#
在python3中,你可以使用
list_a[filter]
来获取True
的值,使用list_a[~filter]
来获取False
的值