比较两个大清单中的项目

时间:2014-09-11 18:08:00

标签: list compare difference

我有两个"大"名单!他们两个都有超过24.000项,我必须选择:

  • 列表1中的项目是什么,但列表2中没有
  • 列表2中的项目是什么,但不在列表1中

根据我的计算,如果我运行循环来找到差异,那么将有24.000x2 = 48.000个循环!

无论如何比我的方式比较快?

只是一个例子:

列表1的值:| a | a | b | c | d | e |

列表2的

值:| a | b | c | g | a |

结果必须是:=> d,e,g

非常感谢!

2 个答案:

答案 0 :(得分:1)

在Python中你可以这样做:

first  = set("aabcde")
second = set("abcga")

first ^ second
#>>> {'g', 'e', 'd'}

这样做会稍快一些:

first  = "aabcde"
second = "abcga"

first, second = sorted([first, second], key=len)
set(first).symmetric_difference(second)
#>>> {'e', 'g', 'd'}

避免从较大的列表中创建一个集合。

你甚至可能想要:

first  = "aabcde"
second = "abcga"

set_first = set(first)
set_first.symmetric_difference_update(second)
set_first
#>>> {'e', 'g', 'd'}

即便如此,24k物品很小,所以没有真正的担心。

手动,显而易见的方法是:

first  = set("aabcde")
second = set("abcga")

difference = set()

for item in first:
    if item not in second:
        difference.add(item)

for item in second:
    if item not in first:
        difference.add(item)

difference
#>>> {'e', 'g', 'd'}

答案 1 :(得分:0)

是。好问题。将每个列表的成员读入树结构(例如,C ++中的std::set)。这会订购您的清单。然后,串联两个树,删除重复项。

更好(但更难理解)技术只将两个列表中的一个读入哈希键控结构(例如,C ++ 11中的std::unordered_set)。

或者你可以先在两个列表上快速排序,然后忘记树木。你有很多选择。然而,我能想到的所有有效选项都涉及首先对两个列表中的至少一个进行排序,装箱或键控;但是,是的,我同意你的观点,24,000项物品足以让人想到比第一种更天真的物品更好的方法。