2010-03-26 2 views
9

을 감안할 때 두 목록 :고급 파이썬리스트 통합

chars = ['ab', 'bc', 'ca'] 
words = ['abc', 'bca', 'dac', 'dbc', 'cba'] 
다음과 같은 조건에 의해 words의 필터링 된 목록을 생성 지능형리스트를 사용하는 방법을

: 각 단어의 길이가 n의 것을 주어 chars 길이 n이다 필터링 된 목록에는 각 i 번째 문자가 words에있는 i 번째 문자열에있는 단어 만 포함되어야합니다.

이 경우 결과적으로 ['abc', 'bca']을 얻게됩니다.

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

또는 사용하여 열거 :

지퍼 사용

답변

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 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'등의 문자열과 일치하지 않습니다. 또한 'chars'목록에 중복 문자열이 포함되어 있으면 'char.index'가 중단됩니다. – Philar

0

더 간단한 방법 :

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

생략 된 조건 "각 i 번째 문자는 i 번째 문자열에 있습니다". – hynekcer