我有一个像这样的遗忘名单。
input.txt中:
WorkBook
代码:
hello
hi
hi
hi
hi
some
text
here
hi
hi
输出:
with open("input.txt", "r") as infile:
infile_list = []
for line in infile:
infile_list.append(line)
for i,t in enumerate(infile_list):
if "hi" in line:
print(i, t)
我想在列表中循环并仅打印包含不按顺序排列的文本的数字(我要清理的列表更大但是相同的想法)。所以在这种情况下我只想打印1和8。 我一直在摆弄一些if语句和循环,但即使在概念上接近,我也是一个新手。
有人指出我正确的方向吗? THX!
编辑:已添加代码
编辑:添加了infile内容
答案 0 :(得分:1)
首先,您可以直接遍历infile
行,不需要先将行附加到列表中。在我的演示中,我将使用列表作为假文件。
大部分工作由itertools.groupby
完成,以查找'hi'
行的序列。 (目前我正在检查没有前导或尾随空格的行是否等于'hi'
,而是使用key
参数所需的任何修订逻辑。)
>>> from itertools import groupby
>>>
>>> infile = '''hello
... hi
... hi
... hi
... hi
... some
... text
... here
... hi
... hi'''.splitlines()
>>>
>>> numbered = enumerate(infile)
>>> grouper = groupby(numbered, key=lambda num_line: num_line[1].strip() == 'hi')
>>> result = [next(group) for hi, group in grouper if hi]
>>>
>>> result
[(1, 'hi'), (8, 'hi')]
如果您对此处发生的事情感到困惑,我建议您打印出中间结果。
修改:展示中间结果
numbered
>>> numbered = list(numbered)
>>> numbered
[(0, 'hello'), (1, 'hi'), (2, 'hi'), (3, 'hi'), (4, 'hi'), (5, 'some '), (6, 'text'), (7, 'here'), (8, 'hi'), (9, 'hi')]
grouper
>>> grouper = groupby(numbered, key=lambda num_line: num_line[1].strip() == 'hi')
>>> [(hi, list(group)) for hi, group in grouper]
[(False, [(0, 'hello')]), (True, [(1, 'hi'), (2, 'hi'), (3, 'hi'), (4, 'hi')]), (False, [(5, 'some '), (6, 'text'), (7, 'here')]), (True, [(8, 'hi'), (9, 'hi')])]
答案 1 :(得分:0)
#read the file into a list
#line[:-1] removes the linebreak `\n` from the end of each line
infile_list = [line[:-1] for line in open("test.txt", "r")]
#initialise the flag
flag = False
#loop through all lines
for i, line in enumerate(infile_list):
#test if "hi" is in line
#if you want to check if it is at the beginning of the line, use line.startswith()
if "hi" in line:
#did the previous line contain a "hi"?
if not flag:
#no -> print line
print(i, line)
#update flag
flag = True
else:
#reset flag
flag = False
您可以关注PythonTutor
上的代码执行