长期潜伏,第一次海报。
我有一个非常大的文本文件(1,184,834行),其中包含有关欧洲特定日期的航班计划的一些信息。每列代表一个新键,每行代表排期的一个新部分。到目前为止,我已经设法使用以下代码将分析所需的数据提取到列表列表中:
import pprint
import csv
pp = pprint.PrettyPrinter(width=200)
text = open('E:/Downloads/TNFL09/20120506_m1.so6', 'r')
def clean_data(text, rows):
newlist = []
reader = list(csv.reader(text, delimiter=' '))
for n in xrange(0, len(reader)):
newlist.append(reader[n][1:6]+reader[n][9:12]+reader[n][16:18])
return newlist[:rows]
data = clean_data(text,90)
pp.pprint(data)
输出如下:
['UAFM', 'EGKK', 'A333', '083914', '084141', 'CMB595', '120506', '120506', '156912756', '91'],
['KEWR', 'VABB', 'B772', '005500', '010051', 'UAL48', '120506', '120506', '156912546', '1']
['KEWR', 'VABB', 'B772', '010051', '010310', 'UAL48', '120506', '120506', '156912546', '2']
对于此问题,有趣的项目是开始/结束时间(#3和#4),航班ID(#8)和序列号(#9)。
每个档次都包含多个连续的序列号。因此,要获得完整的航班,必须提取该航班ID的所有序列号。
我想做的是提取每个航班的开始时间和结束时间。我最初的想法是循环遍历列表中的每个列表,并将序列号与先前迭代的列表进行比较。但是我是Python的初学者,经过几天的谷歌搜索后放弃了。
谢谢,
彼德
一种方法是,假设您的列表是按序列号排序的(看起来像是它们),是通过生成器运行它以将每个排期汇总在一起:
def aggregate_flights(flights):
out = []
last_id = ''
for row in flights:
if row[-2] != last_id and len(out) > 0:
yield (last_id,out)
out = []
last_id = row[-2]
out.append((row[3],row[4])) #2-tuple of (start,end)
yield (last_id,out)
给出您的示例输入:
list(aggregate_flight(agg))
Out[21]:
[('156912756', [('083914', '084141')]),
('156912546', [('005500', '010051'), ('010051', '010310')])]
有点混乱,但是您明白了。对于每个航班,您都会有一个由2个元组组成的列表(start,end)
,您可以对其进行进一步处理以获取该(start,end)
航班的总体信息。您甚至可以修改生成器,以便只为您提供整体(start,end)
,但是我倾向于将我的处理过程分成较小的,易于调试的模块化块。
如果您的输入未排序,则需要使用来累积数据defaultdict
。给它一个list
工厂,并(start,end)
为每行添加一个元组。
编辑:根据要求,这是(start,end)
每次飞行仅产生一对的修改:
def aggregate_flights(flights):
last_id,start,end = None,None,None
for row in flights:
if row[-2] != last_id and last_id is not None:
yield (last_id,(start,end))
start,end = None,None
if start is None:
start = row[3]
last_id = row[-2]
end = row[4]
yield (last_id,(start,end))
在这一点上,我会注意到输出变得太难看而无法遵守(一个(id,(start,end))
元组,嗯),所以我将移至anamedtuple
处以使情况变得更好:
from collections import namedtuple
Flight = namedtuple('Flight',['id','start','end'])
现在,您有了:
def aggregate_flights(flights):
last_id,start,end = None,None,None
for row in flights:
if row[-2] != last_id and last_id is not None:
yield Flight(last_id,start,end)
start,end = None,None
if start is None:
start = row[3]
last_id = row[-2]
end = row[4]
yield Flight(last_id,start,end)
list(aggregate_flights(agg))
Out[18]:
[Flight(id='156912756', start='083914', end='084141'),
Flight(id='156912546', start='005500', end='010310')]
好多了。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句