我有一個列表的列表這樣合併列表
list = [[1, 2], [1, 3], [4, 5]]
,當你看到前兩個子列表的第一個元素重複
所以我想我的輸出太是:
list = [[1, 2, 3], [4, 5]]
謝謝
我有一個列表的列表這樣合併列表
list = [[1, 2], [1, 3], [4, 5]]
,當你看到前兩個子列表的第一個元素重複
所以我想我的輸出太是:
list = [[1, 2, 3], [4, 5]]
謝謝
下面的代碼應該可以解決你的問題:
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
如果循環沒有擊中破退出執行。
我必須首先建立一個字典,由第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]]
非常感謝你 – Sabba
雖然可以說是不可讀:
# 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()
默認行爲。
你可以使用python集合,因爲你可以很容易地計算交集和聯合。代碼將更加清晰,但複雜性可能與其他解決方案相當。
非常感謝你 – Sabba