2010-03-26 3 views
9

Date due liste:avanzata Python di lista

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

come è possibile utilizzare list comprehension per generare un elenco filtrato di words dalla seguente condizione: dato che ogni parola è di lunghezza n e chars è di lunghezza n inoltre, l'elenco filtrato deve includere solo le parole che ogni carattere i -th è nella stringa ith in words.

In questo caso, dovremmo ottenere ['abc', 'bca'] come risultato.

(Se questo sembra familiare a chiunque, questo è stato una delle domande nel precedente marmellata codice di Google)

risposta

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

Francamente, preferisco @ risposta di SilentGhost. –

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

Utilizzando zip:

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

o utilizzando enumerare:

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

Perché così comple X? Questo funziona così:

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

questo non prenderebbe la parola 'bbc' – steabert

0

Questo funziona, utilizzando index:

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

Mi sto perdendo qualcosa?

+0

Non corrisponde alle stringhe come 'bcc', 'bbc' ecc. Inoltre 'char.index' si interromperà se l'elenco 'caratteri' contiene stringhe duplicate. – Philar

0

Un approccio più semplice:

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

Condizione omessa "ogni i-esimo carattere è nella stringa i-esima nelle parole". – hynekcer