在python列表解析中添加额外的语句

Ami*_*tad 2 python list-comprehension

我需要在包含特定字符串的文本文件中找到一行,然后将该行和其后面的所有行追加到列表中.这就是我完成它的方式..

file1 = open("input.txt", "r")
always_print = False
lines = file1.readlines()
output = []
for line in lines:
    if always_print or "def set" in line:  #def set is the string i want
        output.append(line)
        always_print = True
Run Code Online (Sandbox Code Playgroud)

虽然这很好用,但我尝试使用列表推导做同样的事情.这就是我得到的:

lines = [ item.strip() for item in open("input.txt")]
always_print = False
output = [item for item in lines if "def set" or print_always in item]
Run Code Online (Sandbox Code Playgroud)

这显然不起作用,因为当找到所需的字符串时我没有设置always_print = True.我如何在列表理解中做到这一点?

Mar*_*ers 8

使用itertools.dropwhile()查找包含您的第一行def set:

from itertools import dropwhile

output = list(dropwhile(lambda l: 'def set' not in l, lines))
Run Code Online (Sandbox Code Playgroud)

dropwhile()将跳过lines与您的测试不符的任何条目; 一旦匹配它就会停止测试,并从那里开始简单地产生一切.

dropwhile()返回一个迭代器; 我list()在这里使用它将它转换为行列表,但你也可以将它作为另一个循环的基础,比如剥离换行符等.

演示:

>>> from itertools import dropwhile
>>> lines = '''\
... foo
... bar
... def set():
...     spam
...     ham
...     eggs
... '''.splitlines(True)
>>> list(dropwhile(lambda l: 'def set' not in l, lines))
['def set():\n', '    spam\n', '    ham\n', '    eggs\n']
Run Code Online (Sandbox Code Playgroud)