给定索引的快速位串生成

Fast bit string generation given indices

这里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

有没有更好的方法,可以使用 lambdamapitertools 而不是 enumerate

你的方法的问题是你:

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

更好的方法可以是:

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

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

尽管如此,使用 列表 ints 对其进行编码有点奇怪。一种更紧凑的方法是将此 binary 编码为整数。例如通过使用:

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'

如果您正在寻找使用 map/lambda 的解决方案,这里有一条直线:

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