6

ジェネレーターを使用して、Python で特定のセットのサブセットのリストを作成しようとしています。私が持っていると言う

set([1, 2, 3])

入力として、私は持っているべきです

[set([1, 2, 3]), set([2, 3]), set([1, 3]), set([3]), set([1, 2]), set([2]), set([1]), set([])]

出力として。どうすればこれを達成できますか?

4

3 に答える 3

1

私はこれが古すぎることを知っていますが、同じ問題に対する答えを探していました.数時間ウェブ検索に失敗した後、私は自分の解決策を思いつきました. これはコードです:

def combinations(iterable, r):
    # combinations('ABCDE', 3) --> ABC ABD ABE ACD ACE ADE BCD BCE BDE CDE
    pool = tuple(iterable)  # allows a string to be transformed to a tuple
    n = len(pool)  
    if r > n:  # If we don't have enough items to combine, return None
        return
    indices = range(r)  # Make a set of the indices with length (r)
    yield [pool[i] for i in indices]   Yield first list of indices [0 to (r-1)]
    while True:
        for i in reversed(range(r)):  # Check from right to left if the index is at its
                                      # max value. If everyone is maxed out, then finish
            if indices[i] != i + n - r:  # indices[2] != 2 + 5 - 3
                break                    # 2 != 4  (Y) then break and avoid the return
        else:
            return
        indices[i] += 1  # indices[2] = 2 + 1 = 3
        for j in range(i + 1, r):  # for j in []  # Do nothing in this case
            indices[j] = indices[j - 1] + 1  # If necessary, reset indices to the right of
                                             # indices[i] to the minimum value possible.
                                             # This depends on the current indices[i]
        yield [pool[i] for i in indices]  # [0, 1, 3]


def all_subsets(test):
    out = []
    for i in xrange(len(test)):
        out += [[test[i]]]
    for i in xrange(2, len(test) + 1):
        out += [x for x in combinations(test, i)]
    return out

itertools doc itertools.combinationsから組み合わせのサンプル コードを取得し、タプルではなくリストを生成するように変更しました。それがどのように機能するかを理解しようとしていたときに(後で変更するために)注釈を付けたので、誰かが役立つと思った場合に備えて、そこに残します。最後に、all_substes 関数を作成して、長さ 1 から r までのすべてのサブセットを検索しました (空のリストは含まれないため、必要な場合は次のように開始します)。out = [[]]

于 2017-05-08T15:12:26.853 に答える