これが物事を行う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