给定索引的快速位串生成
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
有没有更好的方法,可以使用 lambda
或 map
或 itertools
而不是 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
.
尽管如此,使用 列表 int
s 对其进行编码有点奇怪。一种更紧凑的方法是将此 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))
这里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
有没有更好的方法,可以使用 lambda
或 map
或 itertools
而不是 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
.
尽管如此,使用 列表 int
s 对其进行编码有点奇怪。一种更紧凑的方法是将此 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))