Python:比较两个列表的更好方法?

时间:2017-02-22 03:27:54

标签: python

请不要给我减去。我想问一个更好的方法来解决这个问题,因为我现在正在做的事情对我来说是一个巨大的负担。

Hier是我的问题:我有两个清单。我想确保一个列表中的任何项都不在另一个列表中。

在Python中,我一直在使用以下几行......(假设List_s有3个项目。)

if List_s[0] not in List_big and List_s[1] not in List_big and List_s[2] not in List_big:   #none item from List_s should be in List_big
    do something
else:
    pass

这些线对我来说实际上是可以的,直到我突然意识到我必须处理长度> 200的列表。我有很多要比较的清单。

那我怎么能改变代码呢?非常感谢你的帮助!

3 个答案:

答案 0 :(得分:2)

您可以将其中一个列表转换为set并使用set.intersection

if not set(List_s).intersection(List_big):
    print('no common items between lists')

请注意,两个列表中的元素必须为hashable

答案 1 :(得分:2)

无论您使用:

,都会得到相同的结果
set(List_s).isdisjoint(List_big)

或:

not set(List_s).intersection(List_big)

但是set.isdisjoint要快得多。在我的计算机上,isdisjoint对测试数据运行大约需要150纳秒,而intersection对相同数据运行需要95微秒 - 大约慢630倍!

答案 2 :(得分:1)

对于非常大的列表,

import timeit
import random

L=[random.randrange(2000000) for x in xrange(1000000)]
M=[random.randrange(2000000) for x in xrange(1000000)]

start_time = timeit.default_timer()
print any(x in M for x in L)
#True
print timeit.default_timer() - start_time
#0.00981207940825

start_time = timeit.default_timer()
print not set(L).isdisjoint(M)
#True
print timeit.default_timer() - start_time
#0.164795298542

start_time = timeit.default_timer()
print True if set(L) & set(M) else False
#True
print timeit.default_timer() - start_time
#0.436377859225

start_time = timeit.default_timer()
print True if set(L).intersection(M) else False
#True
print timeit.default_timer() - start_time
#0.368563831022

显然,

print any(x in M for x in L)

效率更高