2013-04-04 57 views
12

我對Python很新穎......我試圖編寫一個函數,它將單獨列表中的唯一值合併到一個列表中。我不斷得到列表元組的結果。最終,我想從我的三個列表中獲得一個唯一值列表-a,b,c。任何人都可以幫我一把嗎?Python 3.3函數將多個列表中的唯一值合併到一個列表中

def merge(*lists): 
    newlist = lists[:] 
    for x in lists: 
     if x not in newlist: 
      newlist.extend(x) 
    return newlist 

a = [1,2,3,4] 
b = [3,4,5,6] 
c = [5,6,7,8] 

print(merge(a,b,c)) 

我得到列表的元組

([1, 2, 3, 4], [3, 4, 5, 6], [5, 6, 7, 8]) 
+3

縮進很重要! – squiguy 2013-04-04 04:40:59

回答

16

您可能只需要集:

>>> a = [1,2,3,4] 
>>> b = [3,4,5,6] 
>>> c = [5,6,7,8] 
>>> 
>>> uniques = set(a + b + c) 
>>> uniques 
set([1, 2, 3, 4, 5, 6, 7, 8]) 
>>> 
3

如果你不關心他們在原來的順序,最簡單的是並且可能的禁食方式是使用設定功能:

>>> set().union(a, b, c) 
{1, 2, 3, 4, 5, 6, 7, 8} 

如果你關心原始訂單(集合發生在這種情況下保留它,但不能保證),那麼你可以通過認識到參數lists包含所有原始元組的元組您通過列出這意味着遍歷它可以讓你每個名單之一的時間,而不是在他們的元素 - 您可以使用itertools模塊裏解決這個問題:

for x in itertools.chain.from_iterable(lists): 
    if x not in newlist: 
     newlist.append(x) 

而且,你會需要newlist作爲空列表而不是輸入列表的副本。

+0

+1用於使用聯合而不是事先將列表添加在一起。這意味着你可以使用其他iterables而不僅僅是列表。 – daboross 2014-04-08 06:09:29

+0

請注意,根據唯一值的數量,檢查'x不在新列表中'的時間將隨着每次迭代而增加。 – 2014-09-19 17:04:54

0
def merge(*lists): 
    newlist = [] 
    for i in lists: 
      newlist.extend(i) 
    return newlist 

merge_list = merge(a,b,c,d) 

merge_list = set(merge_list) 

merge_list = list(merge_list) 

print(merge_list) 
相關問題