与bitarray lib一起使用时python中lambda函数的异常行为

时间:2018-09-29 01:11:30

标签: python bitarray

在下面的代码中,我打算遍历列表t中的每个元素,以确定索引为0的元素的位数。

t = [('\x01', '0'), ('\x08', '3'), ('\x10', '4'), ('\x02', '1'), ('\x1c', '2 3 4')]

就像\x01bitarray的第一位设置时的字节表示。

以下是用于将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)

0 个答案:

没有答案