有一个文本信息如下:
42 453926 Stormwriter restored undeleted 61.1.28.140
44 425968 61.1.28.140
42 425967 Mintguy restored undeleted 61.11.252.22
43 419840 61.11.252.22
我做的是需要根据第一列的这个序号的数据来找对应的数据,像这种有着相同序号的行,他们对应的第二列的ID数据就是对应的,我需要找到这样一对一对的 ID 数据。就这个例子来说就是 453926 跟 425967 是对应的,输出:
453926 425967
而也会有多个相同序号的情况。比如:
42 453926 Stormwriter restored undeleted 61.1.28.140
44 425968 61.1.28.140
42 425967 Mintguy restored undeleted 61.11.252.22
43 419840 61.11.252.22
42 419809 TimStarling
就是需要记录多次,而且是跟最后一个相同序号对应,拿这个例子来说,就是记录第一个42跟最后一个42的对应ID,然后同时也要记录中间那个 42 跟最后一个 42 的 ID,输出这样:
453926 419809(restored行的ID是453926)
425967 419809(restored行的ID是425967)
我开始想的是用字典,但是字典也就只能保留到最后一个相同的序号,怎么做才能让中间的相同序号也能输出对应的呢TUT
我的伪代码如下:
dict={}
if xxx: #只是一个判断处理的条件
flag_number =line.split()[0]
id = line.split()[0]
next()
elif line.split()[0]==flag_number:
dict[id]=line.split()[1]
但是这个代码只能输出第一个跟最后一个相同的序号,如何修改才能也让中间的相同序号跟最后一个序号也输出出来呢
迷茫2017-04-17 17:52:50
用字典是可以的,首先是收集:
INDEX = 0
ID = 1
dic = {}
with open('data') as reader:
for line in reader:
items = line.strip().split()
ids = dic.setdefault(items[INDEX], [])
ids.append(items[ID])
输出:
for index, ids in dic.items():
for sid in ids[0:-1]:
print sid, ids[-1]
或:
# 如果不太懂這段代碼的意思,請參見下面說明,其實我覺得用上面的方法也夠了
for index, ids in dic.items():
for sid, eid in ((id, ids[-1]) for id in ids[0:-1]):
print sid, eid
稍微讲一下这段代码:
((id, ids[-1]) for id in ids[0:-1])
上面这一行是一个产生器表达式( generator expression, 简称genexp),他就类似list comprehension,不过他并不会马上产生实际的资料和list,只有等到你去iterate 或是取值的时候才会依序产生资料项。这代表在资源的利用上,是比较有效率的。
这边产生的generator 可以依序产生一个双元素的tuple,这两个元素都是id,刚好就是一个id pair(第一个元素是各个非最后一个id,第二个元素是最后一个id。
至于:
for sid, eid in ((id, ids[-1]) for id in ids[0:-1]):
就是依次产生 id pair 并且利用 tuple unpacking 平行赋值给 sid
和 eid
,最后输出。 sid
和 eid
,最後輸出。
data
data
:
42 453926 Stormwriter restored undeleted 61.1.28.140
44 425968 61.1.28.140
42 425967 Mintguy restored undeleted 61.11.252.22
43 419840 61.11.252.22
42 419809 TimStarling
结果:🎜
453926 419809
425967 419809