Python二进制比较列表值

2024-04-26 11:42:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试找出如何在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]时子集的位置。例如binary 01=在原始集合[1,2]的位置1处获取索引,该集合将是[2]。你知道吗

二进制11表示从原始集合[1,2]中获取索引位置0和1,该集合给出了[1,2]的答案,以此类推

我怎么能写这个,我的代码是如此混乱,有没有一个简单的方法来映射这个?你知道吗


Tags: 方法答案代码元素列表数量二进制情况
1条回答
网友
1楼 · 发布于 2024-04-26 11:42:07

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

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]]

相关问题 更多 >