删除列表中的重复项的最快方法Python
这是我能想到的最快方法:
import itertools
output_list = list(set(itertools.chain(first_list, second_list)))
轻微更新:作为jcd指出,根据您的应用程序,你可能并不需要将结果转换回列表。由于一组是由本身迭代,你也许可以只直接使用它:
output_set = set(itertools.chain(first_list, second_list))
for item in output_set:
# do something
要小心的是,涉及使用set()
可能会重新排序列表中的元素,所以没有保证元素的任何解决方案将以任何特定的顺序。这就是说,既然你把两个列表结合在一起,很难想出一个很好的理由说明为什么你需要对它们进行特定的排序,所以这可能不是你需要担心的。
哦,你的解决方案比我的更好:) – shylent 2009-11-04 17:22:27
感谢大家的回答,他们都帮了很大的忙! :) – Cookies 2009-11-04 17:38:15
+1。如果命令*很重要,那么也许一个有序集合将会这样做:http://stackoverflow.com/questions/1653970/does-python-have-an-ordered-set – Stephan202 2009-11-04 17:38:57
result = list(set(list1).union(set(list2)))
这就是我该怎么做的。尽管如此,我对演出不太确定,但肯定比手动演奏更好。
'set.union(self,other)'与任何迭代都很好,因为'other' – u0b34a0f6ae 2009-11-04 18:17:52
由于丹尼尔指出,一组不能包含重复的条目 - 所以串连名单:
list1 + list2
新的名单,然后转换为一组:
set(list1 + list2)
然后回到列表:
list(set(list1 + list2))
感谢您解释我的代码在做什么。击败我! :-)我只想提到我编辑我的答案使用'itertools.chain()'而不是仅仅连接列表的原因是因为它避免了在内存中分配第三个大的列表。 'set()'构造函数实际上并不需要列表,它只需要一个可迭代所有元素的迭代器,'itertools.chain()'可以更有效地执行(避免复制)。 – 2009-11-04 17:27:04
我推荐这样的:
def combine_lists(list1, list2):
s = set(list1)
s.update(list2)
return list(s)
这消除了创建头两个连接的怪物列表的问题。
根据你在输出中做什么,不要费心地转换回列表。如果订购是重要的,你可能需要某种装饰/排序/ undecorate shenanig围绕此。
同意,没有必要连接两个列表 - 这只是浪费内存。我希望看到调用's.update(list2)'与上面使用的迭代器方法之间的性能差异。你的方法可能会稍微快一点。但是,正如您指出的那样,通过简单地不转换回最终列表,您可以获得更大的性能节省。 – 2009-11-04 17:34:18
我跑了几个时间点,它似乎有所不同,这是更快,但从来没有超过5%或10%的方式。我会称之为平局。 – jcdyer 2009-11-04 18:14:56
由于itertools只是链接两个对象,我认为它的影响是非常小的,所以问题是set()是一个大的列表还是set()一半的列表和.update() )其余的。看起来没有。 – jcdyer 2009-11-04 18:17:46
您的时间表明一个循环目前需要55个小时。听听提出的解决方案需要多长时间会很有意思。 – behindthefall 2009-11-05 13:45:40