python - 根据 bool 值列表过滤列表

标签 python list numpy

我有一个值列表,我需要过滤给定 bool 值列表中的值:

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] 就足够了。

最佳答案

您正在寻找 itertools.compress :

>>> from itertools import compress
>>> list_a = [1, 2, 4, 6]
>>> fil = [True, False, True, False]
>>> list(compress(list_a, fil))
[1, 4]

时序比较(py3.x):

>>> list_a = [1, 2, 4, 6]
>>> fil = [True, False, True, False]
>>> %timeit list(compress(list_a, fil))
100000 loops, best of 3: 2.58 us per loop
>>> %timeit [i for (i, v) in zip(list_a, fil) if v]  #winner
100000 loops, best of 3: 1.98 us per loop

>>> list_a = [1, 2, 4, 6]*100
>>> fil = [True, False, True, False]*100
>>> %timeit list(compress(list_a, fil))              #winner
10000 loops, best of 3: 24.3 us per loop
>>> %timeit [i for (i, v) in zip(list_a, fil) if v]
10000 loops, best of 3: 82 us per loop

>>> list_a = [1, 2, 4, 6]*10000
>>> fil = [True, False, True, False]*10000
>>> %timeit list(compress(list_a, fil))              #winner
1000 loops, best of 3: 1.66 ms per loop
>>> %timeit [i for (i, v) in zip(list_a, fil) if v] 
100 loops, best of 3: 7.65 ms per loop

不要使用filter作为变量名,它是一个内置函数。

关于python - 根据 bool 值列表过滤列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18665873/

相关文章:

python - "Deparsing"使用 pyparsing 的列表

python - 高效且不消耗内存的方式来查找列表中所有可能的对

javascript - 如何从具有给定(键,值)对的长列表中检索对象?

python - For 两个不同区间之间的循环

numpy - Pytorch 类型错误 : eq() received an invalid combination of arguments

python - 在 Python (3.3) 中生成相关数据

python - 如何在f2py中链接FFTW3?

python - 在 python 中将列表打印到表上

python - 优化点-圆距离法

python - boto3 分区和排序键上的 KeyConditionExpression