if 语句中的列表理解不起作用

Lam*_*amp 1 python for-loop if-statement list-comprehension python-3.x

我正在尝试浏览目录中的所有文件并对具有特定文件名的文件执行某些操作。出于某种原因,当我使用列表理解时 if 语句不起作用,并且所有迭代似乎都进入 if 语句:

for filename in os.listdir(somepath):
    if (str(i_test) in filename for i_test in range(15,20)):
        do something
Run Code Online (Sandbox Code Playgroud)

如果我在 if 语句中明确写入数字,则 if 语句按预期工作:

for filename in os.listdir(somepath):
    if '15' in filename or ('16' in filename) or ('17' in filename) or ('18' in filename) or ('19' in filename):
        do something
Run Code Online (Sandbox Code Playgroud)

我找不到我在列表理解中搞砸的地方。

Car*_*ate 5

首先,一个小问题,但这不是列表理解;那是一个生成器表达式。这里的区别不是很大,但它们是不同的。列表推导式包含在 中[],而生成器表达式则使用()(就像您在此处使用的那样)。

其次,您基本上拥有:

if <generator expression>:
Run Code Online (Sandbox Code Playgroud)

问题在于生成器表达式本身永远不会为假(与列表推导式的结果不同),因此该条件将始终为真。

您想用any“如果任何测试为真”来表示:

if any(str(i_test) in filename for i_test in range(15,20)):
Run Code Online (Sandbox Code Playgroud)