我很难找到一种方法来访问一些以二进制访问模式表示的列表元素。我的意思是:
假设我们有一个4位数的二进制数Bin
: Bin = 0b0000
我们还有一个与Bin长度相同的列表(或集合或元组,无所谓),比如:list = [A, B, C, D]
现在,我想组合访问Bin
中由1
表示的元素,这意味着如果我们在Bin = 0b0101
(这意味着Bin = 10),则计数器在每个循环上增加+1,然后我想访问相应的索引,因此列表中的B
和D
元素。
直到循环结束时,Bin = 0b1111
或Bin = 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']