【问题标题】:Finding difference between two very large lists找出两个非常大的列表之间的差异
【发布时间】:2013-10-09 20:53:53
【问题描述】:

我有两个非常大的列表,一个是 331991 个元素长,我们称之为 a,另一个是 99171 个元素长,称之为 b。我想将 a 与 b 进行比较,然后返回 a 中不在 b 中的元素列表。这也需要尽可能高效,并且按照它们出现的顺序,这可能是给定的,但我想我不妨把它扔在那里。

【问题讨论】:

  • 列表中元素的唯一性重要吗?
  • 必读:你尝试过什么?
  • 1.尝试像[x for x in a if x not in b] 这样的幼稚方法 2. 基准测试 3. 够快吗?如果没有,请尝试其他方法并转到 2。
  • 诸如:[x for x in set(b) if x not in set(a)] 甚至一些基本的东西,例如 [set(a)-set(b)],
  • 首先:明确你真正想做的事情。大约一个小时前,您提出了类似的问题(要处理的数字间隔),当我要发布完整答案时,我发现您已删除了该问题。第二:首先自己阐述你的问题 - 正如其他人所建议的那样 - 你应该展示你已经尝试过的内容。第三:用完整的句子写下你的反应,正如你所看到的,其他反应可能介于两者之间。祝你好运,堆栈溢出。

标签: python algorithm python-2.7


【解决方案1】:

可以在 O(m + n) 时间内完成,其中 m 和 n 对应于两个列表的长度:

exclude = set(b)  # O(m)

new_list = [x for x in a if x not in exclude]  # O(n)

这里的关键是集合具有恒定时间的包含测试。或许您可以考虑将b 作为一个集合开始。

另请参阅:List Comprehension


使用your example

>>> a = ['a','b','c','d','e']
>>> b = ['a','b','c','f','g']
>>> 
>>> exclude = set(b)
>>> new_list = [x for x in a if x not in exclude]
>>> 
>>> new_list
['d', 'e']

【讨论】:

    【解决方案2】:

    让我们假设:

    book = ["once", "upon", "time", ...., "end", "of", "very", "long", "story"]
    dct = ["alfa", "anaconda", .., "zeta-jones"]
    

    并且您想从书单中删除 dct 中存在的所有项目。

    快速解决方案:

    short_story = [word in book if word not in dct]
    

    加速 dct 中的搜索:将 dct 转换为 set - 这具有更快的查找速度:

    dct = set(dct)
    short_story = [word in book if word not in dct]
    

    如果这本书很长,记不住,你可以一个字一个字地处理。为此,我们可以使用生成器:

    def story_words(fname):
    """fname is name of text file with a story"""
      with open(fname) as f:
        for line in f:
          for word in line.split()
            yield word
    
    #print out shortened story
    for word in story_words("alibaba.txt"):
      if word not in dct:
        print word
    

    如果您的字典太大,您将不得不放弃速度并迭代字典的内容。不过这个我暂时跳过。

    【讨论】:

      【解决方案3】:

      这是将b 转换为集合,然后从a 中过滤不存在​​的元素的一种方法:

      from itertools import ifilterfalse
      
      a = ['a','b','c','d','e']
      b = ['a','b','c']
      c = list(ifilterfalse(set(b).__contains__, a))
      # ['d', 'e']
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-08
        • 1970-01-01
        • 1970-01-01
        • 2021-12-05
        • 2015-03-19
        • 2017-04-18
        • 2016-07-04
        • 1970-01-01
        相关资源
        最近更新 更多