在 Python (Powerset) 中获取集合的所有子集

使用文档中的 itertools 配方来获取集合的所有子集。

from itertools import chain, combinations


def powerset(iterable):
    "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
    s = list(iterable)
    return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))


# print(list(combinations([1, 2, 3], 2)))

my_set = {1, 2, 3}

# 👇️ [(), (1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)]
print(list(powerset(my_set)))

在 Python (Powerset) 中获取集合的所有子集

powerset 配方可在文档的此部分中找到。

该方法从可迭代对象中返回长度为 N 的元素的子序列。

from itertools import combinations


# 👇️ [()]
print(list(combinations([1, 2, 3], 0)))

# 👇️ [(1,), (2,), (3,)]
print(list(combinations([1, 2, 3], 1)))

# 👇️ [(1, 2), (1, 3), (2, 3)]
print(list(combinations([1, 2, 3], 2)))

# 👇️ [(1, 2, 3)]
print(list(combinations([1, 2, 3], 3)))

最后一步是使用 chain.from_iterable 方法。

该方法从可迭代对象获取链接输入,例如 [‘ABC’, ‘DEF’] 变为 A B C D E F。

from itertools import chain


# 👇️ [(), (1,), (2,), (3,), (1, 2), (1, 3), (2, 3)]
print(list(chain.from_iterable([
    [()],
    [(1,), (2,), (3,)],
    [(1, 2), (1, 3), (2, 3)],
])))

或者,我们可以定义自己的函数。

def powerset(iterable):
    l = list(iterable)

    result = [tuple()]

    for item in l:
        result += [tup + (item,) for tup in result]

    return result


my_set = {1, 2, 3}

# [(), (1,), (2,), (1, 2), (3,), (1, 3), (2, 3), (1, 2, 3)]
print(powerset(my_set))

该函数将集合转换为列表并使用 for 循环遍历列表。

在每次迭代中,我们使用列表推导来迭代结果变量。 结果变量存储元组列表。

我们使用加法 + 运算符来组合两个元组列表。

print([()] + [(1, 2)])  # 👉️ [(), (1, 2)]

print((1, 2) + (3, 4))  # 👉️ (1, 2, 3, 4)

我们还使用运算符将两个元组的元素组合成一个元组。

选择哪种方法是个人喜好问题。 我会使用文档中的方法,因为它非常高效,经过尝试和测试。