请不要给我减去。我想问一个更好的方法来解决这个问题,因为我现在正在做的事情对我来说是一个巨大的负担。
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的列表。我有很多要比较的清单。
那我怎么能改变代码呢?非常感谢你的帮助!
答案 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)
效率更高