【问题标题】:Find lines beginning with same string and keep last occurance查找以相同字符串开头的行并保留最后一次出现
【发布时间】:2011-10-11 14:59:53
【问题描述】:

我有这些数据:

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 个字符之后的字符不匹配...所以检查重复行不是一个选项。

注意:需要保留顺序。

【问题讨论】:

  • 如果您的问题有帮助,请记住接受您的问题的答案(最后四个问题您没有回答)。
  • @agf,是的,我会这样做。在过去的四个中,我没有令人满意的答案。 (除了一个还在等待我这边的测试)

标签: python search text duplicates ordereddictionary


【解决方案1】:

使用字典,以前 12 个字符为键:

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

这会自动覆盖所有以前的条目。

【讨论】:

  • 然后看agf的解决方案。如果您需要一致的顺序,这将更适合。
【解决方案2】:
from collections import OrderedDict

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

这将保留行的顺序,同时消除重复。

编辑:This version of OrderedDict 适用于 Python 2.4、2.5 和 2.6。

【讨论】:

    【解决方案3】:
    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
    

    【讨论】:

    • 不保留行的顺序。
    • 他最初并没有要求这样做,但我已经对其进行了编辑,使其正确。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-31
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-23
    相关资源
    最近更新 更多