【发布时间】:2013-09-11 00:46:00
【问题描述】:
我有一个值列表,给定布尔值列表中的值,我需要对其进行过滤:
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- 不要将事物与 True 进行比较,就像我对 if filter[idx]==True.. 所做的那样,因为这是不必要的。只需使用if filter[idx] 就足够了。
【问题讨论】:
-
仅供参考,这是一个常见的并行计算原语,称为stream compaction。 (它被称为“原始”不是因为它简单,而是因为它被用作许多其他并行算法的构建块)
-
一些风格注释:
if filter[indx] == True不要不要使用==,如果你想用True检查身份,使用is。无论如何,在这种情况下,整个比较是没有用的,你可以简单地使用if filter[indx]。最后:从不使用内置名称作为变量/模块名称(我指的是名称filter)。使用included之类的东西,这样if就可以很好地读取(if included[indx])。