3

このようなリストのリストがあります

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

ご覧のとおり、最初の 2 つのサブリストの最初の要素が繰り返されます

だから私も私の出力が欲しい:

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

ありがとうございました

4

4 に答える 4

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、ブレークにヒットせずにループを終了した場合に実行されることに注意してください。

于 2012-10-04T10:36:53.127 に答える
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]]
于 2012-10-04T10:30:44.033 に答える
0

交差と結合を非常に簡単に計算できるため、python セットを使用できます。コードはより明確になりますが、複雑さはおそらく他のソリューションに匹敵します。

于 2012-10-04T10:48:14.393 に答える
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()

于 2012-10-04T10:31:08.257 に答える