List 比较两个大列表中的项目

List 比较两个大列表中的项目,list,compare,difference,List,Compare,Difference,我有两张“大”名单!它们都有大约24000多个项目,我必须选择: 什么项目在列表1中但不在列表2中 什么项目在列表2中,但不在列表1中 作为我的计算,如果我运行循环来查找差异,将有24.000x2=48.000个循环 有没有比我快的方法 举个例子: 列表1的值:| a | a | b | c | d | e| 列表2的值:| a | b | c | g | a| 结果必须是:=>d,例如,g 非常感谢 是的。好问题。将每个列表的成员读入树结构(例如,C++中的std::set)。这将为您的列

我有两张“大”名单!它们都有大约24000多个项目,我必须选择:

  • 什么项目在列表1中但不在列表2中
  • 什么项目在列表2中,但不在列表1中
作为我的计算,如果我运行循环来查找差异,将有24.000x2=48.000个循环

有没有比我快的方法

举个例子:

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

列表2的值:| a | b | c | g | a|

结果必须是:=>d,例如,g


非常感谢

是的。好问题。将每个列表的成员读入树结构(例如,C++中的
std::set
)。这将为您的列表排序。然后,一步一步地遍历这两棵树,边走边删除重复项

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


或者您可以先对两个列表进行快速排序,然后忘记树。你有很多选择。然而,我所能想到的所有有效选择都涉及到第一次排序,或装箱,或键入两个列表中的至少一个;但是,是的,我同意您的看法,24000个条目足以值得一个比第一个简单的方法更好的方法。在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'}

你使用什么编程语言?一些选项:对列表进行排序并进行区分,或者将列表添加到单独的哈希中,然后循环使用一个或另一个。我认为这与编程语言无关,这与算法有关!无论如何,我使用python@Thanksher是一个相关的Python。看起来你可以使用内置的Python-foo来完成这个任务。好人:)非常感谢!