找到以相同字符串开头的行并保留最后一次出现

1 投票
3 回答
1245 浏览
提问于 2025-04-16 22:08

我有这些数据:

E 71484666NC 1201011060240260 387802-1227810  1022    25   0   5   2   313D 0 1G5
E 71484666NC 1201011060240263 387902-1227910  1300    10   0   2   1   300D 0 1A5
E 10115693AK 1201011060617450 658160-1517007   021 10  0 896  71   4   131L 2 AA2
E 10310002PR 0201011060102315 191509 -664820 39726  5  5 935  50  46 21282D 5 0hn

我需要找出那些以相同的前12个字符开头的行。如果有多个这样的行,我只想保留最后出现的那一行,之前的都要删除。所以结果应该是这样的:

E 71484666NC 1201011060240263 387902-1227910  1300    10   0   2   1   300D 0 1A5
E 10115693AK 1201011060617450 658160-1517007   021 10  0 896  71   4   131L 2 AA2
E 10310002PR 0201011060102315 191509 -664820 39726  5  5 935  50  46 21282D 5 0hn

注意:在大多数情况下,前12个字符之后的内容是不一样的……所以不能通过检查重复的行来解决这个问题。

注意:要保持原来的顺序。

3 个回答

0

使用一个字典,把前12个字符当作键:

mydict = {}
for line in file:
    key = line[:12]
    value = line
    mydict[key] = line

这样做会自动覆盖之前的所有条目。

1
from collections import OrderedDict

mydata = """E 71484666NC 1201011060240260 387802-1227810  1022    25   0   5   2   313D 0 1G5
E 71484666NC 1201011060240263 387902-1227910  1300    10   0   2   1   300D 0 1A5
E 10115693AK 1201011060617450 658160-1517007   021 10  0 896  71   4   131L 2 AA2
E 10310002PR 0201011060102315 191509 -664820 39726  5  5 935  50  46 21282D 5 0hn"""

datalines = mydata.split('\n')
uniques = OrderedDict((x[:12],x[12:]) for x in datalines)
final = [x+y for x,y in uniques.items()]

for x in final:
  print x

这段代码会产生以下结果:

E 71484666NC 1201011060240263 387902-1227910  1300    10   0   2   1   300D 0 1A5
E 10115693AK 1201011060617450 658160-1517007   021 10  0 896  71   4   131L 2 AA2
E 10310002PR 0201011060102315 191509 -664820 39726  5  5 935  50  46 21282D 5 0hn
4
from collections import OrderedDict

lines = OrderedDict()
for line in file:
    lines[line[0:12]] = line

这样做可以保持行的顺序,同时去掉重复的内容。

补充说明:这个版本的OrderedDict适用于Python 2.4、2.5和2.6。

撰写回答