看看下面的代碼列表成員的最有效的方法:檢查更是一個價值
a = [1,2,3,4]
if 1 in a or 2 in a:
print 'found'
是否有這樣做的更清潔/更優雅的方式?也許:
a = [1,2,3,4]
b = [1,2]
if set(a) & set(b):
print found
看看下面的代碼列表成員的最有效的方法:檢查更是一個價值
a = [1,2,3,4]
if 1 in a or 2 in a:
print 'found'
是否有這樣做的更清潔/更優雅的方式?也許:
a = [1,2,3,4]
b = [1,2]
if set(a) & set(b):
print found
a = [1,2,3,4]
b = [1,2]
print any(x in a for x in b)
True
你基於set
秒例如不工作,因爲它總是非空a
/b
返回True
。然而集可能使用權:
if set(b).issubset(set(a)):
print "found"
請注意b = set([])
始終是set(a)
一個子集。
更新:我剛剛注意到,您只想知道b
中的任何項目是否爲a
的一部分,這與我提出的解決方案不同。在這種情況下,我認爲一個簡單的if/elif/else是最好的解決方案。你可以嘗試使用一個字典或其他迭代與快速contains-lookup。
我聽不懂你的意思 - 布爾(集([5,6])設置([1,2,3,4]))這肯定不是真的。或者我誤解了一些東西? – jaime
不完全理解你的第一句話。是不是先評估'&',然後再提交給'如果'評估? – timebandit
您可以嘗試
if set(a) <= set(b):
print found
但我不知道它是不是你的代碼更高效。
也許這是太簡單了,但if...elif
似乎沒什麼問題:
found = False
if 1 in a:
found = True
elif 2 in a:
found = True
這隻檢查2
在列表中,如果1
不是,因爲你只是想看看是否是任在列表中(不關心哪一個),這應該是很好的
優點:
2
如果1
是已在列表a
轉換爲不同的類型(助手效率)缺點:
時機比較:使用
basecase = """
a = [1,2,3,4]
if 1 in a or 2 in a:
print 'found'
"""
case1 = """
a = [1,2,3,4]
b = [1,2]
if set(b).issubset(set(a)):
print 'found'
"""
case2 = """
found = False
if 1 in a:
found = True
elif 2 in a:
found = True
"""
case3 = """
a = [1,2,3,4]
b = [1,2]
print any(x in a for x in b)
"""
print min(timeit.Timer(<case>).repeat(8, 1000))
產量
basecase = 0.0953138421204
case1 = 0.0974782045301
case2 = 0.0958207179797
case3 = 0.068283250742
這似乎是最優雅和最快的方式 – timebandit