2010-03-26 5 views
9

Gegeben seien zwei Listen:Erweiterte Python Liste Verständnis

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

, wie Sie Listenkomprehensionen verwenden können, um eine gefilterte Liste von words durch die folgende Bedingung zu erzeugen: gegeben, dass jedes Wort der Länge ist n und chars ist der Länge n Außerdem sollte die gefilterte Liste nur Wörter enthalten, die jeweils i -te Zeichen in der i -ten Zeichenfolge in words sind. In diesem Fall sollten wir ['abc', 'bca'] als Ergebnis erhalten.

(Wenn dies jedem vertraut aussieht, war dies eine der Fragen im vorigen jam Google Code)

Antwort

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

Ehrlich gesagt, ich ziehe @ SilentGhost Antwort. –

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

Mit Reißverschluss:

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

oder mit aufzählen:

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

Warum so kompl x? Dies funktioniert auch:

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

das würde das Wort 'bbc' nicht fangen – steabert

0

Dies funktioniert, indem index:

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

bin ich etwas fehlt?

+0

Passt nicht zu den Zeichenfolgen wie 'bcc', 'bbc' usw. Zusätzlich wird 'char.index' brechen, wenn die Liste 'Zeichen' doppelte Zeichenfolgen enthält. – Philar

0

Ein einfacher Ansatz:

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

Ausgelassene Bedingung "jedes i-te Zeichen ist in der i-ten Zeichenfolge in Worten". – hynekcer