Python :列表理解+过滤器
Python : list comprehension + filter
我有一个字符串,我希望从中提取元音和辅音及其索引。
我在考虑:
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)]
你太复杂了
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']]
演示 -
>>> 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)]
您可以通过对 vowels
使用 set
来加快速度,您实际上并不需要 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)]
关于 Python 中嵌套 LC 的第 1 条规则:outer 循环在前。
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
。
正确的语法是明确地使内部循环成为列表理解:
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']]
您可以检查字符串中的成员资格:
>>> '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]
我有一个字符串,我希望从中提取元音和辅音及其索引。
我在考虑:
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)]
你太复杂了
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']]
演示 -
>>> 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)]
您可以通过对 vowels
使用 set
来加快速度,您实际上并不需要 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)]
关于 Python 中嵌套 LC 的第 1 条规则:outer 循环在前。
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
。
正确的语法是明确地使内部循环成为列表理解:
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']]
您可以检查字符串中的成员资格:
>>> '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]