2010-03-26 15 views
9

Dadas dos listas:avanzada Python lista de comprensión

chars = ['ab', 'bc', 'ca'] 
words = ['abc', 'bca', 'dac', 'dbc', 'cba'] 

cómo se puede utilizar listas por comprensión para generar una lista filtrada de words por la siguiente condición: dado que cada palabra es de longitud n y chars es de longitud n también, la lista filtrada debe incluir solo palabras que cada i -ésimo carácter está en el i -ésima cadena en words. En este caso, deberíamos obtener ['abc', 'bca'] como resultado.

(Si esto le resulta familiar a cualquier persona, esta fue una de las preguntas en el anterior atasco de código de Google)

Respuesta

12
[w for w in words if all([w[i] in chars[i] for i in range(len(w))])] 
+2

Francamente, prefiero @ respuesta de SilentGhost. –

19
>>> [word for word in words if all(l in chars[i] for i, l in enumerate(word))] 
['abc', 'bca'] 
3

Usando postal:

[w for w in words if all([a in c for a, c in zip(w, chars)])] 

o el uso de enumerar:

[w for w in words if not [w for i, c in enumerate(chars) if w[i] not in c]] 
-1

Why so comple ¿X? Esto funciona así:

[words[x] for x in range(len(chars)) if chars[x] in words[x]] 
+0

esto no captaría la palabra 'bbc' – steabert

0

esto funciona, usando index:

[words[chars.index(char)] for char in chars if char in words[chars.index(char)]] 

Me estoy perdiendo algo?

+0

No coincide con las cadenas como 'bcc', 'bbc', etc. Además, 'char.index' se romperá si la lista 'caracteres' contiene cadenas duplicadas. – Philar

0

Un enfoque más simple:

yourlist = [ w for w in words for ch in chars if w.startswith(ch) ] 
+0

Condición omitida "cada carácter i-ésimo está en la cadena i-ésima en palabras". – hynekcer

Cuestiones relacionadas