2015-09-17 1 views
0
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 

Cette impression:Filtrage d'une liste par un BitArray

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') 

Je veux supprimer les valeurs dans le main_array où le bit correspondant est False ou 0. à-dire il y a 30 bits faux dans init_bit de sorte que le main_array doit être filtré où le bit est 0 et devenir un tableau de 70 éléments en maintenant la séquence.

J'ai utilisé ceci: filter(lambda t: t[1] == True, zip(main_array, init_bit)) mais cela va prendre beaucoup de mémoire si mon bitarray est très long.

Comment puis-je faire cela plus rapidement?

+0

Avez-vous pensé à utiliser 'itertools.izip()' et 'itertools.ifilter()' ? –

+0

'izip()' fonctionne bien et bien plus vite que 'zip'. Donc je suppose que cela devrait être la réponse. Parmi 'izip()' et 'ifilter()' qui devrait être mieux pour un tableau très long? –

+0

'itertools.ifilter (lambda t: t [1], itertools.izip (main_array, init_bit))' est également une bonne option. –

Répondre

0

Vous n'avez pas besoin ifilter avec une fonction supplémentaire lambda, vous pouvez simplement utiliser une compréhension de la liste:

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