2009-08-23 130 views
52

我有兩個列表,我需要結合第二個列表中有第一個列表的任何重複項被忽略。 ..有點難以解釋,所以讓我展示一下代碼的樣子,以及我想要的結果。組合兩個列表並刪除重複項,而不刪除重複項在原始列表

first_list = [1, 2, 2, 5] 

second_list = [2, 5, 7, 9] 

# The result of combining the two lists should result in this list: 
resulting_list = [1, 2, 2, 5, 7, 9] 

你會發現結果有第一個列表,包括它的兩個「2」的價值觀,但事實證明second_list也有一個額外的2和5的值不被添加到第一個列表。

通常對於這樣的事情我會使用集合,但是first_list上的集合會清除它已有的重複值。所以我只是想知道什麼是最好的/最快的方式來實現這個理想的組合。

謝謝。

+2

這些列表是否總是排序? – Triptych 2009-08-23 19:43:11

+1

如果'second_list'中有三個2,該怎麼辦? – balpha 2009-08-23 19:45:46

+0

@balpha:是的,我還沒有完全決定我想怎麼處理呢。這是我曾經考慮過的事情,但由於我在這件事上的優柔寡斷而被拋棄了:) – 2009-08-23 20:06:18

回答

95

您需要添加到第一列表中的沒有在第一第二列表的那些元素 - 集是確定的最簡單的方法他們是哪些元素,像這樣:

first_list = [1, 2, 2, 5] 
second_list = [2, 5, 7, 9] 

in_first = set(first_list) 
in_second = set(second_list) 

in_second_but_not_in_first = in_second - in_first 

result = first_list + list(in_second_but_not_in_first) 
print result # Prints [1, 2, 2, 5, 9, 7] 

或者,如果你喜歡的俏皮話8-)

print first_list + list(set(second_list) - set(first_list)) 
+2

或者這個,如果你需要它排序:打印first_list +排序(集(second_list) - 設置(first_list)) – hughdbrown 2009-08-23 20:10:31

+0

名單(套(first_list)|集(second_list))#|設置路口看到http://stackoverflow.com/questions/4674013/how-to-take-two-lists-and-combine-them-excluding-any-duplicates – staticd 2013-09-30 15:43:58

+0

@staticd:是的,但給出了錯誤的答案。結果中只有一個'2',當它們應該有兩個時。 – RichieHindle 2013-09-30 16:04:54

3
resulting_list = first_list + [i for i in second_list if i not in first_list] 
+1

setify first_list,你「設置」 – u0b34a0f6ae 2009-08-23 19:34:17

+0

結果列表不會被排序。 – avakar 2009-08-23 19:36:06

+4

這是一個O(m * n)算法。 – hughdbrown 2009-08-23 20:11:49

31
resulting_list = list(first_list) 
resulting_list.extend(x for x in second_list if x not in resulting_list) 
+1

也是O(m * n)算法。 – hughdbrown 2009-08-24 00:04:45

+3

最後一個答案不涉及投入集!榮譽。 – SuperFamousGuy 2013-03-25 18:33:56

+2

這實際上是O(n * m),但是當你有不可排列的事物列表並且性能不是問題時,它可能會很方便 – alcuadrado 2013-04-24 10:14:58

1

這可能有助於

def union(a,b): 
    for e in b: 
     if e not in a: 
      a.append(e) 

聯合函數將第二個列表合併到第一個列表中,如果它已經在a中,則不復制a的元素。與設置聯合運算符類似。這個功能不會改變b。如果a = [1,2,3] b = [2,3,4]。工會後(A,B)使得= [1,2,3,4]和b = [2,3,4]

7

可以使用集:

first_list = [1, 2, 2, 5] 
second_list = [2, 5, 7, 9] 

resultList= List(set(first_list)|set(second_list)) 
resultList=[1,2,5,7,9] 
+2

這是錯誤的結果。再次閱讀問題。 – RichieHindle 2013-10-03 08:40:34

0
first_list = [1, 2, 2, 5] 
    second_list = [2, 5, 7, 9] 

    newList=[] 
    for i in first_list: 
     newList.append(i) 
    for z in second_list: 
     if z not in newList: 
      newList.append(z) 
    newList.sort() 
    print newList 

[1 ,2,2,5,7,9]

1

還可以結合RichieHindle的和Ned巴徹爾德的答覆爲average-case O(M + N)算法,可以保留順序:

first_list = [1, 2, 2, 5] 
second_list = [2, 5, 7, 9] 

fs = set(first_list) 
resulting_list = first_list + [x for x in second_list if x not in fs] 

assert(resulting_list == [1, 2, 2, 5, 7, 9]) 

請注意,x in s has a worst-case complexity of O(m),所以最壞的情況這個代碼的複雜性仍然是O(m * n)

1
first_list = [1, 2, 2, 5] 
second_list = [2, 5, 7, 9] 

print(set(first_list + second_list))