我试图弄清楚如何在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]
,等等。
我该如何编码,我的代码太乱了,有没有简便的方法可以映射它?
答案 0 :(得分: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]]