2010-08-24 8 views

risposta

17

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

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

Si noti che questo produce un iteratore, non una lista. Salva la memoria, ma se hai bisogno di iterarlo più volte o utilizzare indici, puoi sempre usare list(itertools.compress(s, b)). Ancora più corto.

+0

Wow, è impressionante. Saluti per quel delnan - mai saputo di itertools. – Stephen

+0

@Stephen: Itertools è davvero impressionante - non solo mette gli iteratori sugli steroidi (come dice Dive Into Python 3), molti di essi possono essere definiti in meno di 5 righe. Quasi come Haskell: D – delnan

+0

Posso usarlo con '2.6.5'? – Kit

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

È possibile utilizzare list comprehensions:

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 primo prende gli originali due elenchi e zips insieme, in modo da ottenere un elenco (temporaneo - questo è ancora all'interno della lista!) Di coppie di parole e relative maschere, ad esempio [('baa',1), ('baa',0),...]. Quindi solo le parole che hanno una maschera di 1 (if mask == 1) vengono aggiunte allo newList.

+0

Anche se io userei '... se mask', dal momento che ha chiesto di valori veri, non si tratta di' 1' specifico. – delnan

+0

Questo è vero. Lo aggiungerò alla risposta. Grazie delnan. – Stephen

0

Un'altra assumere di lista, witout utilizzando zip

newList = [item for i, item in enumerate(s) if b[i]] 
Problemi correlati