2014-03-06 62 views
4

我敢肯定這個問題已經出現之前,但我找不到一個確切的例子。最好的Pythonic的方式來有條件地追加名單

我有2個列表,並希望將第二個附加到第一個,只有值不在那裏。

到目前爲止,我已經工作的代碼,但不知道是否有一個更好的,更「Python化」是這樣的:

>>> list1 
[1, 2, 3] 
>>> list2 
[2, 4] 
>>> list1.extend([x for x in list2 if x not in list1]) 
>>> list1 
[1, 2, 3, 4] 

編輯 基礎上提出的意見,這個代碼不滿足加入只有一次,即:

>>> list1 = [1,2,3] 
>>> list2 = [2,4,4,4] 
>>> list1.extend([x for x in list2 if x not in list1]) 
>>> list1 
[1, 2, 3, 4, 4, 4] 

我怎麼會最終只:

[1, 2, 3, 4] 
+1

通常情況下,你會使用集合來保持唯一的值。 –

+0

元素的順序是否重要? – thefourtheye

+1

如果'list2'是'[2,4,4]'? – falsetru

回答

4

的一種方式,可以使用內置的set類型:

list(set(list1).union(list2)) 

您將需要存儲操作的結果,如果你想延長list1那麼你可以把它分配給list1

list1=list(set(list1).union(list2)) 

注意:請記住,這種方法可能無法保持列表中元素的順序。

希望這會有所幫助!

+2

'list(set(list1).union(list2) ))''會避免建立一箇中介列表對象。 –

+0

@MartijnPieters這兩者之間有什麼不同嗎?我的意思是,我知道其中的差異,但它有關係嗎? –

+0

這個答案和@thefourtheye的答案都有效。我會去這個,因爲它不需要額外的導入。 – ardochhigh

5

如果要維持秩序,您可以使用collections.OrderedDict這樣

from collections import OrderedDict 
from itertools import chain 
list1, list2 = [1, 2, 3], [2, 4] 
print list(OrderedDict.fromkeys(chain(list1, list2))) 
# [1, 2, 3, 4] 

如果元素的順序並不重要,你可以使用set這樣

from itertools import chain 
list1, list2 = [1, 2, 3], [2, 4] 
print list(set(chain(list1, list2))) 
# [1, 2, 3, 4] 
+2

'list(OrderedDict.fromkeys(chain(list1,list2)))'在Python 2.x和Python 3.x中都可以使用。 – falsetru

+0

@falsetru謝謝男人:)我更新了答案:) – thefourtheye

相關問題