如何在python中使用二进制模式(按位)计数访问列表元素



我很难找到一种方法来访问一些以二进制访问模式表示的列表元素。我的意思是:

假设我们有一个4位数的二进制数Bin: Bin = 0b0000我们还有一个与Bin长度相同的列表(或集合或元组,无所谓),比如:list = [A, B, C, D]

现在,我想组合访问Bin中由1表示的元素,这意味着如果我们在Bin = 0b0101(这意味着Bin = 10),则计数器在每个循环上增加+1,然后我想访问相应的索引,因此列表中的BD元素。

直到循环结束时,Bin = 0b1111Bin = 15,我终于访问列表A, B, C, D的所有元素。

这是麻省理工学院6.00x课程中使用的powerset发电机。

def powerSet(items):
    n = len(items)
    for i in xrange(2**n):
        combo = []
        for j in xrange(n):  
            #print i,j,(i >> j) % 2 == 1 # uncomment to see the values through the loop
            # test bit jth of integer i
            if (i >> j) % 2 == 1:
                combo.append(items[j])
        yield combo
print list(powerSet([1,2,3,4]))
[[], [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3], [4], [1, 4], [2, 4], [1, 2, 4], [3, 4], [1, 3, 4], [2, 3, 4], [1, 2, 3, 4]]

if (i >> j) % 2 == 1也可以写成if (i >> j) & 1

使用>>位运算符

*x>> y返回向右移动y位的x。这与//' x乘以2**y相同。*

如果您不需要完整的功率集:

def bin_access(iterable, index):
    return [b for a,b in zip(reversed(bin(index)[2:]), iterable) if a=='1']

最新更新