2

文字列のリストがあります:

l = ['a', 'b', 'c']

さまざまなサイズのグループで、リスト要素の可能なすべての組み合わせを作成したいと考えています。これがタプルのタプルのリストであることを望みますが、リストのリストのリストなどでもかまいません。タプルの順序、およびタプル内のタプルの順序は重要ではありません。タプルまたはタプルのタプルのいずれかでリスト要素を繰り返すことはできません。上記のリストについては、次のようなものを期待しています。

[(('a'),('b'),('c')),
 (('a', 'b'), ('c')),
 (('a', 'c'), ('b')),
 (('b', 'c'), ('a')),
 (('a', 'b', 'c'))]

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

編集: リスト内の各タプルに l のすべての要素が含まれている必要があります。sentle と Antimony さん、省略に関してはどちらも正しいです。

4

2 に答える 2

3

これが物事を行う1つの方法です。もっとエレガントな方法があるかどうかはわかりません。itertoolsモジュールには組み合わせと順列の機能がありますが、残念ながらパーティションの機能はありません。

編集:私の最初のバージョンは正しくありませんが、幸いなことに、私が行った古いプロジェクトからすでにこれが転がっています。

dの代わりに を返すことで、各パーティションに関連付けられたエッジ ビットセットを表す一意の整数キーを取得することもできますd.values()。これは、あるパーティションが別のパーティションの改良版であるかどうかを効率的にテストするのに役立ちます。

def connectivityDictSub(num, d, setl, key, i):
    if i >= num:
        assert(key not in d)
        d[key] = setl
    else:
        for ni in range(len(setl)):
            nsetl, nkey = setl[:], key
            for other in nsetl[ni]:
                assert(other != i)
                x,y = sorted((i, other))
                ki = ((2*num-3-x)*x)/2 + y-1
                nkey |= 1<<ki
            nsetl[ni] = nsetl[ni] + [i] #not the same as += since it makes a copy
            connectivityDictSub(num, d, nsetl, nkey, i+1)
        nsetl = setl + [[i]]
        connectivityDictSub(num, d, nsetl, key, i+1)

def connectivityDict(groundSet):
    gset = sorted(set(groundSet))
    d = {}
    connectivityDictSub(len(gset), d, [], 0, 0)
    for setl in d.values():
        setl[:] = [tuple(gset[i] for i in x) for x in setl]
    return map(tuple, d.values())

for x in connectivityDict('ABCD'):
    print x
于 2012-10-12T01:32:58.937 に答える
2

itertoolsは、必要な作業のほとんどを実行する必要があります。

例:

stuff = [1, 2, 3]
for L in range(0, len(stuff)+1):
  for subset in itertools.combinations(stuff, L):
    print(subset)

例は itertools を示すためのものです。必要な正確な出力を得るには、それを理解する必要があります。

于 2012-10-12T01:34:04.097 に答える