3

这里 a 是一个列表,例如[34, 52, 57]

该函数接受这个列表并创建一个长度为 64 的位串,其中每个索引都是 0,除了给定的索引。

所以它看起来就像我们[0,0,....1,...1,..1,..0,0,0]只有索引[34, 52, 57]的地方。

def bit_string_gen(a):

    bit_string = []
    for key, value in enumerate(range(64)):
        if key in a:
            bit_string.append(1)
        else:
            bit_string.append(0)

    return bit_string

有没有更好的方法来做到这一点,也许使用lambdaormapitertools代替enumerate.

4

2 回答 2

3

您的方法的问题是您:

  • 对每一位都使用一个if语句;和
  • 使用in可能相当昂贵的测试。

更好的方法可以是:

def bit_string_gen(a):
    bit_string = [0]*64
    for value in a:
        bit_string[value] = 1
    return bit_string

所以在这里你只迭代 的值a,并将这些位设置为1

然而,用s列表int对此进行编码有点奇怪。一种更紧凑的方法是将此二进制编码为整数。例如通过使用:

def bit_string_gen(a):
    bit_string = 0
    for value in a:
        bit_string |= 1 << value
    return bit_string

因此,在最后一种情况下,如果您在示例输入中设置位,您将获得:

>>> bin(bit_string_gen([34, 52, 57]))
'0b1000010000000000000000010000000000000000000000000000000000'
>>> hex(bit_string_gen([34, 52, 57]))
'0x210000400000000'
于 2017-04-10T23:12:18.540 回答
2

如果您正在寻找使用 map/lambda 的解决方案,这里有一个单行:

map(lambda x: 1 if x in [34, 52, 57] else 0, range(0, 64))

于 2017-04-10T23:22:16.190 回答