-1

我试图弄清楚如何在 Python 中做到这一点:

打印出任何给定集合的所有子集。

例如:[1,2]

所以答案是手动的:

[]
[2]
[1]
[1,2]

我意识到解决方案的总数是2(exp)n,其中n是列表中的元素数。

例如,如果列表是[1,3,4],那么子集的总数将是2(exp)3 = 8

我还意识到,如果我得到上面列表的二进制位表示,则会出现以下内容:

例如:[1,2]

00 : []
01 : [2]
10 : [1]
11 : [1,2]

包含 的位的每个位置1,即子集在将其索引到原始集时的位置[1,2]。例如,二进制 01 = 在原始集合的位置 1 处获取索引,[1,2]这将是[2].

[1,2]二进制 11,意味着从给出答案的原始集合中获取索引位置 0 和 1,依此类推[1,2]

我该如何编码,我的代码太乱了,有没有简单的方法来映射这个?

4

1 回答 1

0

您可以使用遍历所有二进制组合的循环和测试计数器的每一位的嵌套循环来决定是否将相应索引的列表元素添加到输出列表中:

def combinations(l):
    for i in range(1 << len(l)):
        c = []
        for b in range(len(l)):
            if i & (1 << (len(l) - b - 1)):
                c.append(l[b])
        yield c

或列表理解:

def combinations(l):
    return [[l[b] for b in range(len(l)) if i & (1 << (len(l) - b - 1))] for i in range(1 << len(l))]

以便:

list(combinations([1, 2])))

会返回:

[[], [2], [1], [1, 2]]

和:

list(combinations([1, 3, 4]))

会返回:

[[], [4], [3], [3, 4], [1], [1, 4], [1, 3], [1, 3, 4]]
于 2018-10-05T03:25:35.220 回答