Расширенное понимание списка Python - PullRequest
10 голосов
/ 26 марта 2010

С учетом двух списков:

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

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

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

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

Ответы [ 6 ]

19 голосов
/ 26 марта 2010
>>> [word for word in words if all(l in chars[i] for i, l in enumerate(word))]
['abc', 'bca']
12 голосов
/ 26 марта 2010
[w for w in words if all([w[i] in chars[i] for i in range(len(w))])]
3 голосов
/ 26 марта 2010

Использование zip:

[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]]
0 голосов
/ 23 апреля 2012

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

yourlist = [ w for w in words for ch in chars if w.startswith(ch) ]
0 голосов
/ 06 октября 2011

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

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

Я что-то упустил?

0 голосов
/ 31 мая 2011

Почему так сложно? Это также работает:

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