我试图通过将二进制计数器与数组相乘来创建一个powerset来获取
Value of Counter Subset
000 -> Empty set
001 -> a
010 -> b
011 -> ab
100 -> c
101 -> ac
110 -> bc
111 -> abc
我的代码:
A = ['a','b','c']
n = len(A)
for i in range(2**n):
print format(i,'b') and A
我将所有输出都显示为['a','b','c']
。是否有不同的方法来执行print语句以获得所需的结果。
答案 0 :(得分:1)
表达式format(i,'b') and A
与“按位 - 和二进制数i
与列表A
的元素”不同。 X and Y
是合乎逻辑的,并且被解释为Y if X else X
,因此您总是得到A
。
您可以使用列表推导,检查&
的按位2**i
(i
是当前索引)和运行编号。此外,不需要显式转换为二进制文件。
>>> [[e for i, e in enumerate(A) if 2**i & x] for x in range(2**n)]
[[], ['a'], ['b'], ['a', 'b'], ['c'], ['a', 'c'], ['b', 'c'], ['a', 'b', 'c']]
答案 1 :(得分:0)
试试这个
d = {0b1: 'a', 0b10: 'b', 0b100: 'c'}
for i in range(0b1000):
s = ''
for k, v in d.items():
if i & k:
s += v
print s
编辑:一些探索
因此,您要尝试将'a', 'b', 'c'
分别与1, 2 and 4
关联。为此,我使用了上面的字典(为了清楚起见使用二进制文字)。
然后,循环遍历所有0< = i< 8,您可以使用1
运算符查看相关位置是否有&
。
e.g。在右边的第二个位置有一个1
:0b00 & 0b10 == 0b01 & 0b10 == 0
是假的,而0b10 & 0b10 == 0b11 & 0b10 != 0
是真的。
答案 2 :(得分:0)
您无法在字符串和列表之间使用按位运算。
我尝试了以下方式。
A = ['a','b','c']
n = len(A)
for i in range(2**n):
s = format(i,'b')[::-1]
print(''.join( (A[j] for j in range(len(s)) if s[j]=='1' )))