【问题标题】:python compare two large lists and process onepython比较两个大列表并处理一个
【发布时间】:2017-08-08 11:55:39
【问题描述】:

我有两个文本文件。在a.txt中有这样的行(一百万行):

991000000019999998,b10000021,
991000000019703408,b10000021,
991000545455435408,b10000045,
991000000029703408,b10000045,
...

第一部分是条形码(991000000019703408),第二部分是bib_number(b10000021)。 请注意 bib_number 可能在每一行中重复。但条形码是唯一的。所以我认为使用 Set() 是不行的。 在另一个文件b.txt中,只有bib_number(60万条记录)的信息:

b10000021
b10000045
b10000215
...

现在我要比较a.txt中的两个文件,如果每行的bib_number(如b10000045)不在b.txt中,则需要将整行输出到c.txt中,如(991000000029703408,b10000045,)

我这样写代码,但直到 20 分钟才得到结果。

with open("a.txt", "r") as f1,open("b.txt", "r") as f2,open("c.txt","w") as f3: 
    total_bb=f1.readlines() 
    list_match=f2.readlines() 
    for item_bb in total_bb:
        recordList=re.split(",",item_bb)
        item_bb_w=(recordList[1])+'\n'
        if item_bb_w not in list_match:
            f3.write(item_bb)

这两个大列表比较有什么技巧吗?谢谢

【问题讨论】:

  • 你在意订单吗?如果不只是把它们变成sets 和set1 - set2 会给你所有缺失的数字。

标签: python list large-data


【解决方案1】:

使用sets,查找是O(1)

with open("a.txt", "r") as f1,open("b.txt", "r") as f2,open("c.txt","w") as f3:
    bs = set(b.strip() for b in f2)
    for a in f1:
        x = a.split(',')
        if x[1].strip() not in bs:
            f3.write(a)

我还会查看 csv 模块以读取逗号分隔值。

【讨论】:

  • 请注意 bib_number 可能在每一行中重复。但是条形码是唯一的。(我已经编辑过)所以我认为使用 Set() 是不行的。 SET() 将删除相同的元素。我需要输出整行,而不仅仅是 bib_number。谢谢
  • 更新为写出整个a
  • @AChampion 不应该'如果 x[1].strip() 不在 b 中" 是 "如果 x[1].strip() 不在 bs 中"?
  • 非常感谢!它非常快!只需大约 3 秒即可获得结果。顺便说一句,为什么使用 set(b.strip() for b in f2) 可以明显提高搜索速度?
  • 列表中的查找是O(n),集合中的查找是O(1)。最初的方法是O(n^2)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-28
相关资源
最近更新 更多