我有一些数据存储在列表中,如果我打印出列表,我会看到以下内容:
.
.
.
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',
'.',
'.',
'.',
'']
