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?
Avez-vous pensé à utiliser 'itertools.izip()' et 'itertools.ifilter()' ? –
'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? –
'itertools.ifilter (lambda t: t [1], itertools.izip (main_array, init_bit))' est également une bonne option. –