给出索引的快速位串生成

时间:2017-04-10 23:05:56

标签: python-3.x loops enumerate bitstring

这里有一个列表,例如[0,0,....1,...1,..1,..0,0,0]

该函数接受此列表并创建一个长度为64的位字符串,其中除了给定索引外,每个索引都为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 才有。{/ p>

lambda

是否有更好的方法可以使用mapitertoolsenumerate代替{{1}}。

2 个答案:

答案 0 :(得分:3)

您的方法存在的问题是:

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

beter方法可以是:

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

所以这里只迭代a的值,然后将这些位设置为1

然而,使用 int s 列表对此进行编码有点奇怪。更简洁的方法是在整数上对此二进制进行编码。例如,使用:

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'

答案 1 :(得分:2)

如果你正在寻找使用map / lambda的解决方案,那么这里就是一个单行:

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