Dato un elenco e una maschera di bit, come faccio a restituire i valori gli indici che sono vere?

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

Domanda

Comincio con la seguente lista s e maschera di bit 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

Come faccio a scrivere qualche funzione apply_bitmask(s, b) in modo che restituisca

['baa', 'have', 'you', 'any']
È stato utile?

Soluzione

Python 3.1 itertools.compress (o Python 2.7 di se non avete ancora aggiornato) fa esattamente questo (l'elenco la comprensione è un vero e proprio secondo posto):

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

Si noti che questo produce un iteratore, non una lista. Consente di risparmiare memoria, ma se avete bisogno di iterare più volte o usare indici, si può sempre utilizzare list(itertools.compress(s, b)). Ancora più breve.

Altri suggerimenti

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

È possibile utilizzare list comprehension :

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.

Questo richiede prima l'originale due liste, e cerniere loro insieme, in modo che si ottiene un (temporaneo - questo è ancora all'interno della lista comp!) lista di coppie di parole e le loro maschere - qualcosa come [('baa',1), ('baa',0),...]. Allora solo le parole che hanno una maschera di 1 (if mask == 1) vengono aggiunti alla newList.

Un altro prendere su di lista, senza l'utilizzo di zip

newList = [item for i, item in enumerate(s) if b[i]]
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top