Python:列表理解+;滤波器

Python:列表理解+;滤波器,python,list-comprehension,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']] 但是,我得到了

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

我在想:

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']]
但是,我得到了
namererror
(说
j
没有定义)。为什么我不能嵌套我的列表理解

我的期望输出:

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

你把事情复杂化了

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']]]

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

cons = [(x, i) for i,x in enumerate(list_) if x not in ['A', 'E', 'I', 'O', 'U']]
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"
>>> 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)]
>>> 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)]

通过对
元音
使用
set
,您可以加快这一速度,并且您实际上不需要
列表
,您可以枚举
a
本身,并获得完全相同的结果。范例-

cons = [(x, i) for i,x in enumerate(list_) if x not in ['A', 'E', 'I', 'O', 'U']]
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"
>>> 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)]
>>> 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)]
关于Python中嵌套LCs的规则#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]

但这将给出错误的结果,因为您首先应该使用
而不是

正确的语法是明确地将内部循环作为列表:

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']]]
但在这里,正确的辅音提取方法很简单(正如其他人所说):


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

>>> '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]

可能是因为你同时使用了两个列表理解。列表理解可以嵌套,我这样做是有问题的,但是你怎么能这样得到索引呢
如果“HELLO”中的“L”:打印“HELLO”。查找('L')
这只会给出第一次出现的
L
(这里2)我的区别是检查元音字符串,而不是元音列表。