Étant donné une liste et un masque binaire, comment puis-je retourner les valeurs les indices qui sont vraies?

StackOverflow https://stackoverflow.com/questions/3555375

Question

Je commence par la liste suivante s et bitmask b:

s = ['baa', 'baa', 'black', 'sheep', 'have', 'you', 'any', 'wool']
b = [1, 0, 0, 0, 1, 1, 1, 0] # or any iterable with boolean values

Comment puis-je écrire quelques apply_bitmask(s, b) de fonction pour qu'elle retourne

['baa', 'have', 'you', 'any']
Était-ce utile?

La solution

3,1 python itertools.compress (ou Python 2.7 de si vous ne possédez pas encore) fait exactement ce que (la liste la compréhension est une véritable seconde près):

import itertools
filtered = itertools.compress(s, b)

Notez que cela produit un itérateur, pas une liste. Enregistre la mémoire, mais si vous devez itérer plusieurs fois ou indices d'utilisation, vous pouvez toujours utiliser list(itertools.compress(s, b)). Encore plus court.

Autres conseils

[ item for item, flag in zip( s, b ) if flag == 1 ]

Vous pouvez utiliser liste de compréhensions:

newList = [word for (word, mask) in zip(s,b) if mask]
# Note: Could also use 'if mask == blah', if mask is not a boolean-compatible type.

Cela prend d'abord les deux listes originales, et fermetures éclair les ensemble, donc que vous obtenez un (temporaire - ce qui est encore à l'intérieur de la liste comp!) liste des paires de mots et de leurs masques - quelque chose comme [('baa',1), ('baa',0),...]. Seuls les mots qui ont un masque de 1 (if mask == 1) sont ajoutés au newList.

Une autre prise sur la compréhension de la liste, sans utiliser zip

newList = [item for i, item in enumerate(s) if b[i]]
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top