枚举列表不按顺序过滤

时间:2018-06-05 07:15:28

标签: python

我有一个像这样的遗忘名单。

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内容

2 个答案:

答案 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)

嗯,因为你很好地问我。但我还是喜欢timgeb的版本:

#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

上的代码执行