Python:列表理解+过滤器

时间:2015-10-02 06:29:21

标签: python list-comprehension

我有一个字符串,我希望从中提取元音和辅音及其索引。

我正在考虑:

a = "HELLO"
list_ = list(a)
vow = [(x, i) for i,x in enumerate(list_) if x in ['A', 'E', 'I', 'O', 'U']]
cons = [(x, i) for i, x in enumerate(list_) if x not in j for j in list_ if j in ['A', 'E', 'I', 'O', 'U']]

但是,我收到NameError(说j未定义)。为什么我无法嵌套我的列表理解。

我想要的输出:

vows : [('E', 1), ('O', 4)]
cons : [('H', 0), ('L', 2), ('L', 3)]

5 个答案:

答案 0 :(得分:4)

第二个列表理解的问题是理想情况下if条件应该结束(在第二个for循环之后,只有j才能访问)。但你真的不需要那个,只需检查x是否不在元音列表中。示例 -

cons = [(x, i) for i,x in enumerate(list_) if x not in ['A', 'E', 'I', 'O', 'U']]

演示 -

>>> a = "HELLO"
>>> list_ = list(a)
>>> vow = [(x, i) for i,x in enumerate(list_) if x in ['A', 'E', 'I', 'O', 'U']]
>>> cons = [(x, i) for i,x in enumerate(list_) if x not in ['A', 'E', 'I', 'O', 'U']]
>>> vow
[('E', 1), ('O', 4)]
>>> cons
[('H', 0), ('L', 2), ('L', 3)]

您可以使用set vowels来提高速度,并且您不需要list_,您可以枚举a本身,并获得完全相同结果。示例 -

vowel_set = {'A', 'E', 'I', 'O', 'U'}
vow = [(x, i) for i,x in enumerate(a) if x in vowel_set]
cons = [(x, i) for i,x in enumerate(a) if x not in vowel_set]

演示 -

>>> a = "HELLO"
>>> vowel_set = {'A', 'E', 'I', 'O', 'U'}
>>> vow = [(x, i) for i,x in enumerate(a) if x in vowel_set]
>>> cons = [(x, i) for i,x in enumerate(a) if x not in vowel_set]
>>> vow
[('E', 1), ('O', 4)]
>>> cons
[('H', 0), ('L', 2), ('L', 3)]

答案 1 :(得分:2)

你过度复杂了

a = "HELLO"
list_ = list(a)
vow = [(x, i) for i,x in enumerate(list_) if x in ['A', 'E', 'I', 'O', 'U']]
cons = [(x, i) for i, x in enumerate(list_) if x not in ['A', 'E', 'I', 'O', 'U']]

详见Anand S Kumar的答案:)

嵌套中的错误是你需要再次嵌套

cons = [(x, i) for i, x in enumerate(list_) if x not in [j for j in list_ if j in ['A', 'E', 'I', 'O', 'U']]]

答案 2 :(得分:2)

关于Python中嵌套LC的规则#1:外部循环首先出现。

cons = [(x, i) for j in list_ if j in ['A', 'E', 'I', 'O', 'U'] for i, x in enumerate(list_) if x not in j]

但这会产生错误的结果,因为您应该首先使用not in

答案 3 :(得分:2)

正确的语法是明确地使内循环成为列表理解:

cons = [(x, i) for i, x in enumerate(list_) if x not in [ j for
            j in list_ if j in ['A', 'E', 'I', 'O', 'U']]]

但是这里获得辅音的正确方法很简单(正如其他人已经说过的那样):

cons = [(x, i) for i,x in enumerate(list_) if x not in ['A', 'E', 'I', 'O', 'U']]

答案 4 :(得分:2)

您可以检查字符串中的成员身份:

>>> 'I' in 'AEIOU'
True

您可以将字符串中的每个字符转换为集合的成员,以便稍微加快搜索速度:

>>> 'Z' in set('AEIOU')
False

你不需要第二个内循环:

>>> vowels = set('AEIOU')
>>> vows = [(char, index) for index, char in enumerate(word) if char in vowels]
>>> cons = [(char, index) for index, char in enumerate(word) if char not in vowels]