我有一个列表,列表中的每个数字代表 2 的幂例如,我有一个列表
Binarylist = [[4,3,0],[2,1,0]]
对于 Binarylist[0],每个数字可以表示为 2^4、2^3、2^0,因此以 2 为底的 11001。
对于 Binarylist[1],每个数字都可以表示为 2^2、2^1、2^0,因此以 2 为底的 111。
我怎样才能使 [[4,3,0],[2,1,0]] 到 11001 和 111?
解决您的问题有两个部分。首先,您需要将列表转换为整数,因为列表中的数字代表二进制字符串中的数字。然后您可以使用bin
转换为二进制格式:
>>> bin(sum(2**n for n in Binarylist[0]))
'0b11001'
如果您想更多地控制如何将整数转换为二进制格式的字符串,您可以查阅此 SO 帖子。
这将为您提供一个字符串列表,其中一个对应于Binarylist
.
[format(sum(2**n for n in powers), 'b') for powers in Binarylist]
结果:
['11001', '111']
您的索引将数字表示为二进制数。因此,假设列表中的第一个数字始终是最大幂:
def to_ones_repr(powers_repr):
res = [0] * (powers_repr[0] + 1)
for power in powers_repr:
res[-(power+1)] = 1
return res
用法:
>>> to_ones_repr([4, 3, 0])
[1, 1, 0, 0, 1]
>>> to_ones_repr([2, 1, 0])
[1, 1, 1]
或者,如果您想要一个字符串,请改为:
def to_ones_str_repr(powers_repr):
res = ['0'] * (powers_repr[0] + 1)
for power in powers_repr:
res[-(power+1)] = '1'
return "".join(res)
>>> to_ones_str_repr([4, 3, 0])
'11001'
>>> to_ones_str_repr([2, 1, 0])
'111'
或者,计算数字,然后使用bin
函数:
def to_ones_str_repr(powers_repr):
return bin(sum(2**i for i in powers_repr))
>>> to_ones_str_repr([4, 3, 0])
'0b11001'
>>> to_ones_str_repr([2, 1, 0])
'0b111'
因此,每个列表中的数字都是二进制数的索引,其中位设置为1
所有其他位置0
,所以只需从最大索引迭代到0
并输出1
如果索引在列表中0
>>> l=[4,3,0]
>>> [1 if i in l else 0 for i in range(max(l),-1,-1)]
[1, 1, 0, 0, 1]
为了提高效率,您可以使用恒定时间set
来代替,list
如果i in l
需要,您可以将结果列表加入到输出字符串中。
既然要进行按位运算,为什么不使用“按位或”运算符呢?
import operator
a = [4,3,0]
mynum = reduce(operator.or_, (2**x for x in a))
print bin(mynum)
reduce 表达式等价于2**4 | 2**3 | 2**0
像这样:
[bin(sum(map(lambda y: pow(2,y) ,x))) for x in BinaryList]
这使:
['0b11001', '0b111']
这使用列表推导来遍历列表中的每个列表。然后在ping er 函数到 中的每个数字时找到bin
of 的 ary 值。sum
map
pow
x
正如 Claudiu 所提到的,这可以使用两个列表推导来完成,并且没有map
/lambda
这可能更容易阅读并且肯定更短:
[bin(sum([pow(2,y) for y in x])) for x in BinaryList]