2012-10-04 145 views
2

我有一個列表的列表這樣合併列表

list = [[1, 2], [1, 3], [4, 5]] 

,當你看到前兩個子列表的第一個元素重複

所以我想我的輸出太是:

list = [[1, 2, 3], [4, 5]] 

謝謝

回答

1

下面的代碼應該可以解決你的問題:

def merge_subs(lst_of_lsts): 
    res = [] 
    for row in lst_of_lsts: 
     for i, resrow in enumerate(res): 
      if row[0]==resrow[0]: 
       res[i] += row[1:] 
       break 
     else: 
      res.append(row) 
    return res 

注意,else屬於內for如果循環沒有擊中破退出執行。

+0

非常感謝你 – Sabba

1

我必須首先建立一個字典,由第1的解決方案值,然後創建一個列表,但順序可能不一樣(即[4, 5]可能是[1, 2, 3]前):

>>> from collections import defaultdict 
>>> d = defaultdict(list) 
>>> map(lambda x: d[x[0]].append(x[1]), l) 
[None, None, None] 
>>> d 
defaultdict(<type 'list'>, {1: [2, 3], 4: [5]}) 
>>> [[key] + list(val) for key, val in d.iteritems()] 
[[1, 2, 3], [4, 5]] 
+0

非常感謝你 – Sabba

0

雖然可以說是不可讀:

# Note the _ after the list, otherwise you are redefining the list type in your scope 
list_ = [[1, 2], [1, 3], [4, 5]] 

from itertools import groupby 
grouper = lambda l: [[k] + sum((v[1::] for v in vs), []) for k, vs in groupby(l, lambda x: x[0])] 

print grouper(list_) 

更可讀的變體:

from collections import defaultdict 
groups = defaultdict(list) 
for vs in list_: 
    group[vs[0]] += vs[1:] 

print group.items() 

注意,這些解決您的問題更寬泛的形式,而不是[[1, 2], [1, 3], [4, 5]]你也可以有這樣的事情:[[1, 2, 3], [1, 4, 5], [2, 4, 5, 6], [3]]


有關_的說明。這就是爲什麼你不希望覆蓋list

spam = list() 
print spam 
# returns [] 

list = spam 
print list 
# returns [] 

spam = list() 
# TypeError: 'list' object is not callable 

正如你可以在上面看到,通過設置list = spam我們打破了list()默認行爲。

+0

謝謝:_代表什麼?我是一個初學者 – Sabba

+0

@ user1422056:_後綴是防止名稱與其他變量衝突的默認約定。由於'list'已經存在於Python中,所以通常使用'list_'來代替。 「del」,「with」,「for」等也是如此。 – Wolph

0

你可以使用python集合,因爲你可以很容易地計算交集和聯合。代碼將更加清晰,但複雜性可能與其他解決方案相當。