0

色々と調べてみたのですが、これをどう表現すればいいのかよくわかりません。リストのリストがあり、各内部リストは特定のサイズ k です。サイズが k+1 の組み合わせのリストを生成したいと考えています。たとえば、次から始めるとします。

[[1,2],[1,3],[3,4]]

リストを生成したい:

[[1,2,3],[1,3,4]]

リストが任意に長い場合。itertools ライブラリの組み合わせ関数を使用する必要があると考えており、おそらくユニオンで設定します。これを効率的に行う方法については、ちょっと行き詰まっています。

どんな助けでも大歓迎です!

編集:明確にする必要があります。元のリストの 2 つを組み合わせた長さ k+1 (この場合は 3) のリストを生成しようとしているだけです。したがって、それらが集合である場合、2 つの集合の和集合をとったときに得られる長さ k+1 の集合のみが必要です。

4

3 に答える 3

1

いくつかの組み合わせが欠落しているため、予想される出力について正確にはわかりませんが、これを試してください:

import itertools
L = [[1,2],[1,3],[3,4]]
print list(itertools.combinations(list(set(itertools.chain.from_iterable(L))), len(L[0])+1))

list(set(itertools.chain.from_iterable(L)))リストを平坦化し、一意の要素を取得します。次に、それと最初のアイテムの長さの組み合わせを取得します ( k)

于 2013-11-03T03:21:57.533 に答える
1

IIUC、こんなものはどうですか?

>>> from itertools import combinations
>>> lol = [[1,2],[1,3],[3,4]]
>>> k = len(lol[0])
>>> pair_sets = (set().union(*x) for x in combinations(lol,2))
>>> keep = [sorted(x) for x in pair_sets if len(x) == k+1]
>>> keep
[[1, 2, 3], [1, 3, 4]]

set().union(*x)セットの任意のコレクションの結合を取得する良い方法です。ここでは、set(x[0]).union(x[1])代わりに使用することもできました。

によって生成される要素は、次のpair_setsようなセットです。

>>> pair_sets = list(set().union(*x) for x in combinations(lol,2))
[set([1, 2, 3]), set([1, 2, 3, 4]), set([1, 3, 4])]

そして、 length のものを保持k+1し、適切な方法で並べ替えます。

于 2013-11-03T03:32:04.347 に答える
1

出力の順序を気にしない場合は、@DSM の回答が正しいものです。ただし、次のような入力が[[3,2],[1,3],[7,2]]あり、入力の順序を保持する必要がある場合は、要素がset.

違いがわかるように、彼のコードをミラーリングします。

from itertools import combinations, chain
from collections import OrderedDict
lol = [[3,2],[1,3],[7,2]]
k = len(lol[0])
pair_sets = [list(OrderedDict.fromkeys(chain.from_iterable(x))) for x in combinations(li,2)]
keep = [x for x in pair_sets if len(x) == k+1]
keep
[[3, 2, 1], [3, 2, 7]]
于 2013-11-03T03:52:00.113 に答える