このようなリストのリストがあります
list = [[1, 2], [1, 3], [4, 5]]
ご覧のとおり、最初の 2 つのサブリストの最初の要素が繰り返されます
だから私も私の出力が欲しい:
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
、ブレークにヒットせずにループを終了した場合に実行されることに注意してください。
最初の値で最初に辞書を作成し、それからリストを作成するソリューションがありますが、順序は同じではない可能性があります(つまり[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]]
交差と結合を非常に簡単に計算できるため、python セットを使用できます。コードはより明確になりますが、複雑さはおそらく他のソリューションに匹敵します。
おそらく判読不能ですが:
# 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()
。