在列表Python中删除重复项的最快方法

Coo*_*ies 12 python sorting list

我有两个非常大的列表,并且至少需要一秒钟来循环它,我需要做200,000次.删除两个列表中的重复项以形成一个副本的最快方法是什么?

Dan*_*den 20

这是我能想到的最快的方式:

import itertools
output_list = list(set(itertools.chain(first_list, second_list)))
Run Code Online (Sandbox Code Playgroud)

轻微更新:正如jcd指出的那样,根据您的应用程序,您可能不需要将结果转换回列表.由于集合本身是可迭代的,因此您可以直接使用它:

output_set = set(itertools.chain(first_list, second_list))
for item in output_set:
    # do something
Run Code Online (Sandbox Code Playgroud)

请注意,任何涉及使用的解决方案set()都可能会重新排序列表中的元素,因此不能保证元素将按任何特定顺序排列.也就是说,既然你正在组合两个列表,那么很难找到一个很好的理由为什么你需要对它们进行特定的排序,所以这可能不是你需要担心的事情.

  • +1。如果顺序*很重要,那么也许有序集就可以了:http://stackoverflow.com/questions/1653970/does-python-have-an-ordered-set (2认同)

jcd*_*yer 11

我推荐这样的东西:

def combine_lists(list1, list2):
    s = set(list1)
    s.update(list2)
    return list(s)
Run Code Online (Sandbox Code Playgroud)

这消除了创建前两个串联的怪物列表的问题.

根据您对输出所做的操作,不要费心转换回列​​表.如果订购很重要,你可能需要某种装饰/排序/不合理的恶作剧.

  • 同意,没有必要连接两个列表 - 这只会浪费内存.我有兴趣看到调用`s.update(list2)`与我上面使用的迭代器方法之间的性能差异.您的方法可能会稍快一点.但是,正如您所指出的那样,通过最终不转换回列表,您可以获得更大的性能节省. (2认同)

Rob*_*ing 7

正如Daniel所说,一个集合不能包含重复的条目 - 所以连接列表:

list1 + list2
Run Code Online (Sandbox Code Playgroud)

然后将新列表转换为集合:

set(list1 + list2)
Run Code Online (Sandbox Code Playgroud)

然后回到列表:

list(set(list1 + list2))
Run Code Online (Sandbox Code Playgroud)

  • 感谢您解释我的代码正在做什么.打败我吧!:-)我只是提到我编辑我的答案使用`itertools.chain()`而不是仅仅连接列表的原因是因为它避免了必须在内存中分配第三个大型列表.`set()`构造函数实际上不需要列表,它只需要一个迭代可以迭代所有元素,而`itertools.chain()`可以更有效地(通过避免复制). (2认同)