【问题标题】:list comprehension in if statement not workingif 语句中的列表理解不起作用
【发布时间】:2020-05-14 08:21:41
【问题描述】:

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

for filename in os.listdir(somepath):
    if (str(i_test) in filename for i_test in range(15,20)):
        do something

如果我在 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

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

【问题讨论】:

  • if any(str(i_test) in filename for i_test in range(15,20)):
  • 您遇到的问题是您的理解返回了一个生成器对象,其布尔值始终为真。
  • 你也可以试试:if [i_test for i_test in range(15,20) if str(i_test) in filename]:
  • @GiannisClipper 您只是在隐式玩弄非空列表具有真正的布尔值这一事实。最好像 r.ook 那样明确检查文件中是否存在。读起来更好。

标签: python python-3.x for-loop if-statement list-comprehension


【解决方案1】:

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

第二,你基本上有:

if <generator expression>:

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

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

if any(str(i_test) in filename for i_test in range(15,20)):

【讨论】:

    【解决方案2】:

    您可以使用re

    import re
    
    to_find = re.compile('|'.join(map(str, range(15,21)))
    
    for filename in os.listdir(somepath):
        if to_find.search(filename):
            #do something
    

    【讨论】:

      猜你喜欢
      • 2022-12-10
      • 2023-03-13
      • 2019-11-03
      • 1970-01-01
      • 2012-07-16
      • 2021-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多