我有一些数据存储在列表中,如果我打印出列表,则会看到以下内容:
.
.
.
007 A000000 Y
007 B000000 5
007 C010100 1
007 C020100 ACORN FUND
007 C030100 N
007 C010200 2
007 C020200 ACORN INTERNATIONAL
007 C030200 N
007 C010300 3
007 C020300 ACORN USA
007 C030300 N
007 C010400 4
.
.
.
序列前后的点表示存在其他数据,它们的结构类似,但可能不是该第七项的一部分(007)。如果第七项的第一个值为'007 A000000 Y',那么我想创建一些数据项的字典列表。我可以做到这一点,只需遍历列表中的所有项目并将它们的值与变量的一些测试值进行比较即可。例如一行代码:
if dataLine.find('007 B')==0:
numberOfSeries=int(dataLine.split()[2])
我想做的是
if dataLine.find(''007 A000000 Y')==0:
READ THE NEXT LINE RIGHT HERE
现在我必须遍历每个周期的整个列表
我想缩短处理时间,因为我大约有6万个文件,每个文件有500到5,000行。
我曾考虑过要创建对该列表的另一个引用并计算数据线,直到dataLine.find(''007 A000000 Y')== 0。但这似乎不是最优雅的解决方案。
最佳答案
您可以使用itertools.groupby()
将序列划分为多个子序列。
import itertools
for key, subseq in itertools.groupby(tempans, lambda s: s.partition(' ')[0]):
if key == '007':
for dataLine in subseq:
if dataLine.startswith('007 B'):
numberOfSeries = int(dataLine.split()[2])
如果您只想查找该行,
itertools.dropwhile()
也可以使用,list(itertools.dropwhile(lambda s: s != '007 A000000 Y', tempans))
['007 A000000 Y',
'007 B000000 5',
'007 C010100 1',
'007 C020100 ACORN FUND',
'007 C030100 N',
'007 C010200 2',
'007 C020200 ACORN INTERNATIONAL',
'007 C030200 N',
'007 C010300 3',
'007 C020300 ACORN USA',
'007 C030300 N',
'007 C010400 4',
'.',
'.',
'.',
'']