【问题标题】:Python 2.7 if not any syntax?Python 2.7 如果没有任何语法?
【发布时间】:2017-01-14 08:45:17
【问题描述】:

我刚刚阅读了来自SlothRemove lines that contain certain string 问题的精彩回复,同时正在寻找一种过滤掉 txt / csv 文件中的垃圾行的方法。要点是“从输入文件中获取 x y z 单词/字符串/任何内容,然后过滤每一行,只写未过滤的行。”

他发布的代码是:

bad_words = ['bad', 'naughty']

with open('oldfile.txt') as oldfile, open('newfile.txt', 'w') as newfile:
for line in oldfile:
    if not any(bad_word in line for bad_word in bad_words):
        newfile.write(line)

我的问题是:有人能解释一下if not any(bad_word in line for bad_word in bad_words): 吗?

我尝试输入if not any(bad_word in line):,但它给了我一个错误。

我试图理解为什么。在 python 文档网页上粗略搜索对我没有帮助(我是 Python/编程的新手,可能不太聪明,无法启动 :-))。

感谢我阅读的任何参考资料。

谢谢!

【问题讨论】:

标签: list python-2.7 if-statement syntax


【解决方案1】:

有人能解释一下if not any(bad_word in line for bad_word in bad_words)这一行吗

当然。

bad_word in line for bad_word in bad_words 就是所谓的generator expression。它与list comprehension 非常相似,但内存效率更高。

if not any(bad_word in line for bad_word in bad_words):
    newfile.write(line)

基本上相当于:

list1 = []
for bad_word in bad_words:
    if bad_word in line:
        list1.append(True)
    else:
        list1.append(False)

if not any(list1):
    newfile.write(line)

我尝试输入if not any(bad_word in line):,但它给了我一个错误

是的,因为 anyiterable 作为输入,并且您提供了一个布尔值(bad_word in line 的计算结果为 True 或 False,您无法对其进行迭代)。

尝试提供您可以迭代的内容,例如列表:if not any([True, False, True]):

【讨论】:

  • 非常感谢您的牵手。
  • "bad_word in line for bad_word in bad_words" 是生成器而不是列表。
  • 这是你的意思吗? stackoverflow.com/questions/19933753/…
  • “因为any 将列表作为输入,并且您提供了一个迭代器”... 不正确,bad_word in line 给出的是布尔值,而不是迭代器。
  • 您提供的代码不等价,因为 any() 是短路的。
猜你喜欢
  • 2015-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-07
  • 2021-01-10
  • 1970-01-01
相关资源
最近更新 更多