Yuval Adam
Yuval Adam

Reputation: 165340

Advanced Python list comprehension

Given two lists:

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

how can you use list comprehensions to generate a filtered list of words by the following condition: given that each word is of length n and chars is of length n as well, the filtered list should include only words that each i-th character is in the i-th string in words.

In this case, we should get ['abc', 'bca'] as a result.

(If this looks familiar to anyone, this was one of the questions in the previous Google code jam)

Upvotes: 10

Views: 4447

Answers (6)

Rushil Paul
Rushil Paul

Reputation: 2048

A more simple approach:

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

Upvotes: 0

Ari
Ari

Reputation: 458

This works, using index:

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

Am I missing something?

Upvotes: 0

Mikka
Mikka

Reputation: 2133

Why so complex? This works as well:

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

Upvotes: -1

flight
flight

Reputation: 1748

Using zip:

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

or using enumerate:

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

Upvotes: 4

SilentGhost
SilentGhost

Reputation: 320019

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

Upvotes: 21

Marcelo Cantos
Marcelo Cantos

Reputation: 186118

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

Upvotes: 13

Related Questions