Python “一行”;至于;if测试中的循环

Python “一行”;至于;if测试中的循环,python,if-statement,numpy,Python,If Statement,Numpy,我想在通过if测试的numpy.ndarray的几个元素上运行一系列命令 if测试为numpy.array中包含值“nan”(非numpy.nan)和列表中定义的一系列字符串的行设置过滤器 我的问题是if测试的第二部分,这里基本上是我如何编码的: d=numpy.array(whatever data) filter_list=["..", "..."] for line in d: if (("nan" not in line) & ([filter_list[i] not

我想在通过
if
测试的
numpy.ndarray
的几个元素上运行一系列命令

if
测试为
numpy.array
中包含值
“nan”
(非
numpy.nan
)和列表中定义的一系列字符串的行设置过滤器

我的问题是if测试的第二部分,这里基本上是我如何编码的:

d=numpy.array(whatever data)
filter_list=["..", "..."]
for line in d:
     if (("nan" not in line) & ([filter_list[i] not in line for i in range(len(filter_list))]):
         "do commands"
因此,“nan”部分按预期工作,但无论是否在行中找到“.”或“…”都通过了另一个测试

我认为问题来自于语法,第二个测试实际返回的是一个组合[True/False,False/True],其布尔值总是
True

总之,只需关注测试的第二部分:我想要一个单行测试,检查定义的拒绝字符串是否存在于值列表中。

boolean\u条件([])
是无意义的。
bool
列表的位和是什么

此外,
([…])
部分的长度始终为
len(filter_list)
,因此非空,因此作为布尔值,它始终为
True

你应该

  • (惰性计算,逻辑和)替换
    (按位和热切计算)
  • 替换

    [filter_list[i] not in line for i in range(len(filter_list))]
    

它应该会起作用

更好的解决方案是在列表上进行惰性评估:

filter_list = ["..", "...", "nan"]
for line in d:
     if not any(fi in line for fi in filter_list):
         "do commands"

啊,对不起,Martijn,请随意回滚我的编辑,我现在将停止删除您的修复程序。因为“循环”的“一行”被称为“列表理解”。“any()”是迄今为止最好的解决方案,因为它不需要在找到真实值后检查进一步的值。还要注意,Elazar小心地使用了生成器,而不是列表。这避免了不必要地创建整个列表,因此在大型数据集上的性能会更好。我认为从性能角度来看,正则表达式将是最快的方法。但它不会那么可读。多亏了你,最后一个正是我想要的(我在刚才使用的原始代码中使用了“and”,因为它更快,而不是问题的根源)。如果你发布了一个关于一些模糊错误的问题,你最好不要更改你使用的语法。这可能令人困惑。
filter_list = ["..", "...", "nan"]
for line in d:
     if not any(fi in line for fi in filter_list):
         "do commands"