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"