2010-03-26 135 views
9

鉴于两个列表:高级Python列表理解

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

你如何使用列表解析生成的words已筛选列表下面的条件:给每个单词的长度是nchars是长度n的同样,过滤的列表应该只包含每个i字符在words中的第i个字符串中的字。

在这种情况下,我们应该得到['abc', 'bca']

(如果这看起来熟悉的人,这是在以前的谷歌代码果酱的问题之一)

回答

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

坦率地说,我更喜欢@ SilentGhost的答案。 – 2011-09-18 23:21:57

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

使用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]] 
-1

为什么这么完成X?这工作,以及:

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

这不会匹配单词'bbc' – steabert 2011-09-04 15:14:26

0

这工作,使用index

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

我缺少的东西?

+0

不匹配'bcc','bbc'等字符串。此外,如果列表'chars'包含重复的字符串,'char.index'将会中断。 – Philar 2013-12-24 13:54:28

0

一个更简单的方法:

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

省略条件“每个第i个字符在第i个字符串中”。 – hynekcer 2012-04-23 00:03:06