【问题标题】:Python Binary compare to List valuesPython二进制与列表值比较
【发布时间】:2019-03-10 12:00:08
【问题描述】:

我想弄清楚如何在 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,2] 的位置 1 处获取索引,这将是 [2]

二进制 11,表示从原始集合 [1,2] 中获取索引位置 0 和 1,其答案为 [1,2],等等。

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

【问题讨论】:

  • 欢迎来到 Stack Overflow!请参观并通读帮助中心,特别是如何提问。你最好的选择是做你的研究,搜索关于 SO 的相关主题,然后试一试。在进行更多研究和搜索后,发布一个最小、完整和可验证的尝试示例,并具体说明您遇到的问题,这可以帮助您获得更好的答案!
  • 也许这可能会有所帮助:stackoverflow.com/questions/374626/…
  • 看看itertools recipes:def powerset(iterable): - 它把你所有的集合创建为元组。也许你可以从那里工作

标签: python binary set bit


【解决方案1】:

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

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

【讨论】:

  • 谢谢你的回答,你能解释一下这条线到底是做什么的吗?:for i in range(1
  • 不客气。通过“这条线”,您是在谈论列表理解吗?这只是更简洁地编写我的第一个代码示例的一种方式。你可以阅读更多关于它的信息here
  • 哦,不,我确实理解列表理解,我只是不明白为什么你要用 len(l )-b-1。这一行特别是: if i & (1
猜你喜欢
  • 2020-08-14
  • 1970-01-01
  • 2015-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多