2014-06-23 54 views
0

看看下面的代碼列表成員的最有效的方法:檢查更是一個價值

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 

回答

3
a = [1,2,3,4] 
b = [1,2] 

print any(x in a for x in b) 
True 
+0

這似乎是最優雅和最快的方式 – timebandit

4

你基於set秒例如不工作,因爲它總是非空a/b返回True。然而集可能使用權:

if set(b).issubset(set(a)): 
    print "found" 

請注意b = set([])始終是set(a)一個子集。

更新:我剛剛注意到,您只想知道b中的任何項目是否爲a的一部分,這與我提出的解決方案不同。在這種情況下,我認爲一個簡單的if/elif/else是最好的解決方案。你可以嘗試使用一個字典或其他迭代與快速contains-lookup。

+0

我聽不懂你的意思 - 布爾(集([5,6])設置([1,2,3,4]))這肯定不是真的。或者我誤解了一些東西? – jaime

+0

不完全理解你的第一句話。是不是先評估'&',然後再提交給'如果'評估? – timebandit

0

您可以嘗試

if set(a) <= set(b): 
    print found 

但我不知道它是不是你的代碼更高效。

1

也許這是太簡單了,但if...elif似乎沒什麼問題:

found = False 

if 1 in a: 
    found = True 
elif 2 in a: 
    found = True 

這隻檢查2在列表中,如果1不是,因爲你只是想看看是否是任在列表中(不關心哪一個),這應該是很好的

優點:

  • 其SIM PLE
  • 您可以保存一張支票上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 
+0

這個解決方案對我來說看起來很可怕。爲什麼我們要用一個臨時變量並將'or'子句分散到elif子句中? – ch3ka

+0

@ ch3ka,有什麼特別的原因? – wnnmaw

+0

'如果1中的a或b中的1比'中的1中的1更短且更精確 - 而且第一個已經短路,所以你的專業人員不會持有。 – ch3ka