2016-11-18 101 views
-4

我有這樣的目錄列表:分組和刪除列表中的重複元素蟒蛇

my_list = [ 
    [1, 'green', 'orange', 'blue'] 
    [2, 'orange', 'black'] 
    [1, 'green', 'pink' ] 
    [3, 'white'] 
    [2, 'purple', 'yellow', 'black'] 
] 

所以,我需要有一個像這樣從my_list另一個列表:

output_list = [ 
    [1, 'green', 'orange', 'blue', 'pink'] 
    [2, 'orange', 'black', 'purple', 'yellow'] 
    [3, 'white'] 
] 

是有一個有效的方法來做它有一個計數my_list非常大?我的意思是最好的方法應該更好,而不是使用兩個嵌套for循環?我不期望一些代碼,只是想法!

Thx。

+5

它看起來像你想我們爲你寫一些代碼。儘管許多用戶願意爲遇險的編碼人員編寫代碼,但他們通常只在海報已嘗試自行解決問題時才提供幫助。展示這一努力的一個好方法是包含迄今爲止編寫的代碼,示例輸入(如果有的話),期望的輸出以及實際獲得的輸出(輸出,回溯等)。您提供的細節越多,您可能會收到的答案就越多。檢查[FAQ](http://stackoverflow.com/tour)和[如何提問](http://stackoverflow.com/questions/how-to-ask)。 – TigerhawkT3

+1

只需使用'dict'將每個子列表中的第一個元素映射到(一組)其餘元素,然後再回到列表中。 –

+0

在編輯時刪除您的問題通常是一個好主意,可以防止發送垃圾郵件。當您添加了您已經嘗試過的示例時,請重新上傳,以及它爲什麼不起作用。 – Aaron

回答

0

我在評論中指出,tobias_k的建議很可能是最有效的,但從來沒有提供任何代碼...這裏是我會做什麼:

out = {} #output dictionary can be converted back to a list later 
for item in my_list: #for each sublist 
    k = item[0] #first item is our dict key 
    l = item[1:] #rest of the list is data 
    new = out.get(k, set()) #get whatever is at out[k] or return an empty set if nothing is there yet 
    new.update(l) #add the items from l (sets will automatically trash duplicates) 
    out[k] = new #set out[k] to our newly updated set 
+0

您的代碼不會按照我的預期構建輸出列表。無論如何,我正在考慮如何使用字典函數(內置函數),但我不知道如何使用它,因爲第一個元素作爲鍵和顏色名稱的值的字典會有重複的鍵,I對不同的顏色名稱表示相同的鍵。其實,我不屑使用字典。 –

+0

我很抱歉@Aaron,你的代碼運行良好。我之前嘗試過一個錯誤。謝謝。 –

+0

沒有問題,我週末已經過去了,但我可以舉一個如何最初轉換回列表的例子...... – Aaron

1

這應該做你想要什麼:

output_list = [] 
for lst in my_list: 
    for l in output_list: 
     if l[0] == lst[0]: 
      for item in lst: 
        if item not in l: 
         l.append(item) 
      break 
    else: 
     output_list.append(lst) 
+0

''綠色''在列表1中被欺騙......與示例輸出不匹配 – Aaron

+0

哎呀,沒有看到他們不想在列表中找到對手。不過現在已經修復了。 –

4
my_list = [ 
    [1, 'green', 'orange', 'blue'], 
    [2, 'orange', 'black'], 
    [1, 'green', 'pink' ], 
    [3, 'white'], 
    [2, 'purple', 'yellow', 'black'] 
] 

values = set(map(lambda x:x[0], my_list)) 
newlist = [[x] + list(set(sum([y[1:] for y in my_list if y[0] == x], []))) for x in values] 
print newlist 

它是如何工作的?

set(map(lambda x:x[0], my_list)創建一個包含[1, 2, 3]的集合 - my_list中每個列表的第一個元素。

然後,我們將values的每個值使用[___ for x in values]

對於值中的每個值,我們遍歷my_list並添加0 th元素等於x的所有列表。 (除0個元素本身,當然)

然後,我們列出的名單列表:

[[['green', 'orange', 'blue'], ['green', 'pink']], [['orange', 'black'], ['purple', 'yellow', 'black']], [['white']]] 

所以我們串接使用sum(the_list, [])每個第三個維度列表。

然後我們要刪除重複項,所以:

list(set(sum(the_list, []))) 

我們結束:

[list(set(sum([y[1:] for y in my_list if y[0] == x], []))) for x in values] 

而唯一剩下的就是第一個元素(x本身)添加到任何子列表,所以

[[x] + ... for x in values] 

然後我們終於得到:

[[x] + list(set(sum([y[1:] for y in my_list if y[0] == x], []))) for x in values] 
+0

如果你使用Python 3,你應該把'print'語句改成'print()'函數。 – MaxLunar

+1

@MaxLunar這不是問題的主要部分...只是爲了調試。我認爲這很清楚 –

+2

@YamimSalmon我會建議展開你的一個班輪爲新手... +1進行詳細解釋,但代碼本身本來可以簡單一些。這不是[ppcg](http://codegolf.stackexchange.com/):P – Aaron