0

我有一个列表,列表中的每个数字代表 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?

4

6 回答 6

3

解决您的问题有两个部分。首先,您需要将列表转换为整数,因为列表中的数字代表二进制字符串中的数字。然后您可以使用bin转换为二进制格式:

>>> bin(sum(2**n for n in Binarylist[0]))
'0b11001'

如果您想更多地控制如何将整数转换为二进制格式的字符串,您可以查阅此 SO 帖子

于 2013-10-17T01:26:43.857 回答
2

这将为您提供一个字符串列表,其中一个对应于Binarylist.

[format(sum(2**n for n in powers), 'b') for powers in Binarylist]

结果:

['11001', '111']
于 2013-10-17T01:24:47.050 回答
2

您的索引将数字表示为二进制数。因此,假设列表中的第一个数字始终是最大幂:

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'
于 2013-10-17T01:23:09.953 回答
1

因此,每个列表中的数字都是二进制数的索引,其中位设置为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需要,您可以将结果列表加入到输出字符串中。

于 2013-10-17T01:23:01.867 回答
1

既然要进行按位运算,为什么不使用“按位或”运算符呢?

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

于 2013-10-17T01:30:36.593 回答
0

像这样:

[bin(sum(map(lambda y: pow(2,y) ,x))) for x in BinaryList]

这使:

['0b11001', '0b111']

这使用列表推导来遍历列表中的每个列表。然后在ping er 函数到 中的每个数字时找到binof 的 ary 值。summappowx

正如 Claudiu 所提到的,这可以使用两个列表推导来完成,并且没有map/lambda这可能更容易阅读并且肯定更短:

[bin(sum([pow(2,y) for y in x])) for x in BinaryList]
于 2013-10-17T01:23:52.033 回答