列表理解中的三元运算符未按预期工作
ternary operator in list comprehension not working as expected
编辑:事实证明这个问题与列表理解完全无关。问题是由于没有将完整路径传递而仅将文件名传递到 os.path.isfile()
中,这使得它始终评估为 False。
为什么这个列表理解前面的 if/else 没有按预期工作?下面的语句生成了一个全为 0 的列表(其他情况)。
[1 if os.path.isfile(file) else 0 for file in os.listdir(path)]
如果文件是文件,预期输出为 1,如果文件是目录,预期输出为 0
我已经在另一条线上独立测试了 1 if os.path.isfile(file) else 0
并且它按预期工作(有 1 和 0 的混合)。我的列表理解语句找不到任何语法问题。
更有趣的是,如果我用其他东西替换条件,例如 1 if file else 0
,行为就会翻转。现在每个项目都变成 1,即使有些项目预计为 0(同样,我使用完全相同的条件表达式独立验证了它们)
我已经尝试将 bool()
添加到我的条件中,但它没有任何作用。我也试过 str(file) 也没有区别。
尝试将文件的绝对路径传递给isfile
函数:
[1 if os.path.isfile(os.path.join(path, file)) else 0 for file in os.listdir(path)]
你也可以不用 if
:
[int(os.path.isfile(os.path.join(path, file))) for file in os.listdir(path)]
不用三元运算符也可以做到:
[int(os.path.isfile(os.path.join(path, file))) for file in os.listdir(path)]
或取决于您打算如何处理结果列表:
[os.path.isfile(os.path.join(path, file)) for file in os.listdir(path)]
我总是喜欢后者
编辑:事实证明这个问题与列表理解完全无关。问题是由于没有将完整路径传递而仅将文件名传递到 os.path.isfile()
中,这使得它始终评估为 False。
为什么这个列表理解前面的 if/else 没有按预期工作?下面的语句生成了一个全为 0 的列表(其他情况)。
[1 if os.path.isfile(file) else 0 for file in os.listdir(path)]
如果文件是文件,预期输出为 1,如果文件是目录,预期输出为 0
我已经在另一条线上独立测试了 1 if os.path.isfile(file) else 0
并且它按预期工作(有 1 和 0 的混合)。我的列表理解语句找不到任何语法问题。
更有趣的是,如果我用其他东西替换条件,例如 1 if file else 0
,行为就会翻转。现在每个项目都变成 1,即使有些项目预计为 0(同样,我使用完全相同的条件表达式独立验证了它们)
我已经尝试将 bool()
添加到我的条件中,但它没有任何作用。我也试过 str(file) 也没有区别。
尝试将文件的绝对路径传递给isfile
函数:
[1 if os.path.isfile(os.path.join(path, file)) else 0 for file in os.listdir(path)]
你也可以不用 if
:
[int(os.path.isfile(os.path.join(path, file))) for file in os.listdir(path)]
不用三元运算符也可以做到:
[int(os.path.isfile(os.path.join(path, file))) for file in os.listdir(path)]
或取决于您打算如何处理结果列表:
[os.path.isfile(os.path.join(path, file)) for file in os.listdir(path)]
我总是喜欢后者