2010-08-24 14 views

Respuesta

17

Python 3.1 itertools.compress (o Python 2.7's si no se ha actualizado todavía) hace exactamente eso (la lista es una comprensión muy cerca segundo):

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

Tenga en cuenta que esto produce un iterador, no una lista. Guarda la memoria, pero si necesita repetirla varias veces o usar índices, siempre puede usar list(itertools.compress(s, b)). Aún más corto.

+0

Guau, eso es impresionante. Saludos por ese delnan, nunca supe sobre itertools. – Stephen

+0

@Stephen: Itertools es impresionante, no solo pone iteradores con esteroides (como lo dice Dive Into Python 3), muchos de ellos se pueden definir en menos de 5 líneas. Casi se siente como Haskell: D – delnan

+0

¿Puedo usar eso con '2.6.5'? – Kit

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

Puede utilizar 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. 

Primero toma las dos listas originales, y zips, para que pueda obtener una lista (temporal - ¡todavía está dentro de la lista!) De pares de palabras y sus máscaras - algo así como [('baa',1), ('baa',0),...]. Entonces solo las palabras que tienen una máscara de 1 (if mask == 1) se agregan al newList.

+0

A pesar de que haría uso de '... si mask', ya que él le preguntó sobre los verdaderos valores, no se trata de' 1' específicamente. – delnan

+0

Eso es verdad. Lo agregaré a la respuesta. Gracias, Delnan. – Stephen

0

otra toma en la lista de la comprensión, witout usando postal

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