List 比较两个大列表中的项目
我有两张“大”名单!它们都有大约24000多个项目,我必须选择: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)。这将为您的列
- 什么项目在列表1中但不在列表2中
- 什么项目在列表2中,但不在列表1中
非常感谢 是的。好问题。将每个列表的成员读入树结构(例如,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来完成这个任务。好人:)非常感谢!