在下面的代码中,我打算遍历列表t
中的每个元素,以确定索引为0的元素的位数。
t = [('\x01', '0'), ('\x08', '3'), ('\x10', '4'), ('\x02', '1'), ('\x1c', '2 3 4')]
就像\x01
是bitarray
的第一位设置时的字节表示。
以下是用于将byte
表示形式转换为bitarray
格式,然后调用位计数函数count()
lambda x : string_to_bitarray(x[0], n).count()
def string_to_bitarray(U, n = -1):
res = bitarray.bitarray(endian = "little")
res.frombytes(U)
if n != -1 and n > 0: return res[:n]
return res
在我的代码中,我正在创建一个lambda函数列表,这些函数的返回类型为布尔值。以下是代码段:
def generate_filters(n):
l = []
for i in range(n+1):
l.append(lambda x : string_to_bitarray(x[0], n).count() == i)
return
使用以下代码:
n = 5
cfilters = generate_filters(n)
for x in t:
p = [f(x) for f in cfilters]
代码的期望是,如果设置的位数为'i',则返回索引为'i'的布尔值设置为n
的大小为True
的列表。但是,它没有按预期工作。
以下是可重复性的代码。
import bitarray as bt
def string_to_bitarray(U, n = -1):
res = bt.bitarray(endian = "little")
res.frombytes(U)
if n != -1 and n > 0: return res[:n]
return res
def generate_filters(n):
l = []
for i in range(n+1):
l.append(lambda x : string_to_bitarray(x[0], n).count() == i)
return l
if __name__ == "__main__":
t = [('\x01', '0'), ('\x08', '3 '), ('\x10', '4 '), ('\x02', '1 '), ('\x1c', '2 3 4 ')]
n = 5
cfilters = generate_filters(n)
for x in t:
p = [f(x) for f in cfilters]
print(p)