2010-03-26 2 views
9

Даны два списка:Расширенный Python список постижение

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

как можно использовать списочные для создания отфильтрованного списка words следующим условием: при условии, что каждое слово имеет длину n и chars имеет длину n также отфильтрованный список должен содержать только слова, которые каждый i-й символ находится в i-й строке в words.

В этом случае мы должны получить ['abc', 'bca'].

(Если это выглядит знакомо любому, это был один из вопросов в предыдущем вареньем кода Google)

ответ

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

Честно говоря, я предпочитаю @ ответ SilentGhost в. –

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

Использование почтового индекса:

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

или с помощью перечисления:

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

Зачем так дополнять Икс? Это работает так:

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

это не поймало бы слово «bbc» – steabert

0

Это работает, используя index:

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

ли я что-то отсутствует?

+0

Не соответствует строкам типа «bcc», «bbc» и т. Д. Кроме того, «char.index» сломается, если список «chars» содержит повторяющиеся строки. – Philar

0

Более простой подход:

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

Неисправленное условие «каждый i-й символ находится в i-й строке в словах». – hynekcer

Смежные вопросы