【问题标题】:ternary operator in list comprehension not working as expected列表理解中的三元运算符未按预期工作
【发布时间】:2021-09-22 12:16:54
【问题描述】:

编辑:这个问题与列表理解完全无关。问题是由于没有将完整路径传递给os.path.isfile(),而只是将文件名传递给了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
  • file 在布尔上下文中总是会计算为True。否则,您需要提供更多信息,以使其成为可重现的示例。
  • @a_guest Wut?这似乎很误导......
  • @deceze 你是什么意思?
  • @a_guest file 在哪里被评估为布尔值?

标签: python list operating-system list-comprehension


【解决方案1】:

尝试将文件的绝对路径传递给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)]

【讨论】:

  • 哇,这就是问题所在......感谢您指出这一点,它现在正在工作。
  • 乐于助人:)
【解决方案2】:

不用三元运算符也可以:

[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)]

我总是喜欢后者

【讨论】:

    猜你喜欢
    • 2019-12-10
    • 2018-02-19
    • 2018-11-14
    • 2012-12-22
    • 2020-01-09
    • 1970-01-01
    • 2016-01-13
    • 1970-01-01
    相关资源
    最近更新 更多