通过bitarray

时间:2015-09-17 06:01:44

标签: python python-2.7 bitarray

import bitarray
from random import randint

LEN = 100

main_array = [randint(0, LEN) for _ in range(LEN)]
init_bit = bitarray.bitarray([True]*LEN)
false_points = [randint(0, LEN) for _ in range(30)]

print init_bit
for i in false_points: init_bit[i] = False
print init_bit

打印:

bitarray('1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111')
[20, 31, 3, 97, 64, 96, 74, 83, 96, 56, 30, 9, 63, 50, 15, 65, 18, 97, 37, 11, 37, 25, 24, 36, 17, 85, 25, 32, 37, 1, 19, 24, 79, 20, 55, 66, 73, 13, 55, 69, 14, 21, 69, 66, 20, 99, 52, 68, 98, 97, 70, 42, 34, 28, 20, 90, 9, 61, 37, 44, 81, 26, 89, 20, 89, 54, 39, 19, 5, 87, 35, 92, 80, 13, 26, 16, 33, 38, 84, 98, 72, 15, 50, 43, 34, 58, 4, 9, 14, 28, 69, 69, 32, 36, 41, 98, 43, 99, 78, 80]
bitarray('0111110110001111111111110011111111111110111000101100011111100011111111111101110001101111011111111010')

我想删除main_array中相应位为False或0的值。即init_bit中有30个假位,因此main_array应为在位为0的情况下进行过滤,并成为保持序列的70个元素的数组。

我使用了这个:filter(lambda t: t[1] == True, zip(main_array, init_bit))但如果我的bitarray很长,这会占用大量内存。

我怎样才能更快地完成这项工作?

1 个答案:

答案 0 :(得分:0)

您不需要具有额外lambda函数的ifilter,您只需使用列表解析:

>>> from itertools import izip
>>> [i for i,j in izip(main_array, init_bit) if j]