2010-08-24 8 views

Antwort

17

Python 3.1 itertools.compress (oder Python 2.7's, wenn Sie noch nicht aktualisiert haben) macht genau das (die Liste Verständnis eine echte enge Sekunde ist):

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

Beachten Sie, dass dies einen Iterator erzeugt, keine Liste. Speichert Speicher, aber wenn Sie es mehrmals durchlaufen oder Indizes verwenden müssen, können Sie immer list(itertools.compress(s, b)) verwenden. Noch kürzer.

+0

Wow, das ist beeindruckend. Cheers für diesen Delnan - wusste nie über Itertools. – Stephen

+0

@Stephen: Itertools ist in der Tat beeindruckend - nicht nur es setzt Iteratoren auf Steroiden (wie Dive Into Python 3 formuliert), viele von ihnen können in weniger als 5 Zeilen definiert werden. Fast fühlt sich an wie Haskell: D – delnan

+0

Kann ich das mit '2.6.5' benutzen? – Kit

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

kehrt können Sie list comprehensions verwenden:

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. 

Das erste nimmt die ursprünglichen zwei Listen, und sie zusammen, so dass Sie eine (temporäre - das ist immer noch in der Liste comp!) Liste von Wortpaaren und ihre Masken - so etwas wie [('baa',1), ('baa',0),...]. Dann werden nur die Wörter mit der Maske 1 (if mask == 1) zu newList hinzugefügt.

+0

mit Obwohl ich '... wenn mask' verwenden würde, da er über die wahren Werte gefragt, nicht um '1' spezifisch. – delnan

+0

Das stimmt. Ich füge es der Antwort hinzu. Danke, Delnan. – Stephen

0

Ein weiteres übernehmen Liste Verständnis, witout zip

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