用二进制乘以列表

时间:2017-12-07 15:37:04

标签: python bit-manipulation

我试图通过将二进制计数器与数组相乘来创建一个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语句以获得所需的结果。

3 个答案:

答案 0 :(得分:1)

表达式format(i,'b') and A与“按位 - 和二进制数i与列表A的元素”不同。 X and Y是合乎逻辑的,并且被解释为Y if X else X,因此您总是得到A

您可以使用列表推导,检查&的按位2**ii是当前索引)和运行编号。此外,不需要显式转换为二进制文件。

>>> [[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。在右边的第二个位置有一个10b00 & 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' )))