2017-07-14 57 views
1

我想構建一個單線程來檢查一個列表中的任何值是否存在於另一個列表中,如果它存在或不存在,則返回True或False。如果我不使用集合,如何檢查一個列表中的值是否在另一個列表中,並且Python中的if語句是單行的?

我已經得到了最接近的是以下幾點:

[i in list1 for i in list2] 

這裏的問題是,它會通過列表1和輸出取決於如果存在列表1中的項目上重複True和Falses列表列表2。

我能做的是通過這個新創建的True和False列表迭代,但我不能在同一行中做到這一點。在這種情況下,我不能使用一個集合或導入任何函數,因爲我在第三方軟件中將此用作條件,因爲您無法在條件或使用函數中插入集合。

+0

你到目前爲止嘗試過什麼?請參閱https://stackoverflow.com/help/how-to-ask和https:// stackoverflow。com/help/mcve – Jimbo

+0

我試過 [我在列表1中爲我在列表2中]和[我爲列表1中列出我如果我在列表2中] 但都沒有返回我所需要的。我也看過不同的方式來設置或不在1行,但我不能在這裏使用這些。 –

回答

5

您能給我們一個any(..)內置功能與發電機的表達:

any(e in list2 for e in list1) 

因此,這將檢查是否有出現在兩個列表中的至少一個元素。

但請注意,這會導致最壞情況的算法。例如,如果元素是可散列的,並且您可以使用set,那麼我們可以將其設置爲平均值算法O(n)

+0

實際上完美的工作,只是測試它。我知道將這整個代碼放在一行中會導致性能問題,但這是我唯一可以使用的唯一方法。 –

+0

這是關於如果元素不可散列可以獲得的最佳性能。 O(n^2)永遠是你最糟糕的情況,因爲不管你在列表中循環的順序如何,總是有唯一可以共享的元素是每個列表中最後一個的可能性。 '''''''足夠聰明,一旦找到匹配就停止迭代。 – perigon

1

你也可以做

set(list1).intersection(list2) 

得到的一組發生在這兩個元素;如果沒有交集,集合的長度爲0,否則爲正。您可以將此集合視爲布爾值,因爲Python會將空集設置爲False,將非空集設爲True。

if set(list1).intersection(list2): 
    print ('Lists have elements in common') 
else: 
    print ('No elements in common') 

運行時間爲O(n)平均情況,爲O(n^2)最壞的情況:https://wiki.python.org/moin/TimeComplexity

+0

不幸的是,我不能使用集,因爲它不是我們正在編寫腳本的系統的condition標記中的一個可接受的表達式,否則我可以使用它。 –

+0

不要100%明白你的意思,但如果問題是將對象設置爲布爾值,那麼你也可以使用'''如果len(set(list1).intersection(list2))> 0:''。雖然這有點難看。 – perigon

+0

這種情況正在基於XML的系統中實現。在那個系統中,有一些XML條件屬性(cond's),您可以在其中插入評估的實際python條件。這些條件是用python編寫的,但是在這些條件中可以包含的內容是有限制的,這種情況下的限制是你不能繼續使用兩行,並且不能在其中使用set。我希望這是有意義的。 –

0

Supose我們有這樣的名單:

list1 = ['bar', 'foo', 'qwerty', 9, 1] 
list2 = [1, 2, 3, 'foo'] 

如果我們希望看到的重複值:

[i for i in list1 if i in list2] 

輸入:

['foo', 1] 

如果我們想真正的錯誤:

(map(lambda each: each in list1, list2)) 

輸入:

[True, False, False, True] 

輸入被檢查列表2,第一個值「1」存在於列表1,最後「富」太。

相關問題