元音列表:奇怪的lambda表达式

时间:2018-05-20 16:53:17

标签: python list lambda filter

有人可以解释为什么下面的代码会产生一个元音列表吗?似乎lambda表达式应该只是查看字符串的第一个字母,但不知何故它正在收集字符串中的所有字符,这些字符位于" aeiou":

nameFull = input("Please enter your name: ")
nameBroken = nameFull.split()

print(list(filter(lambda x: x[0] in "aeiou", nameFull)))

#(i.e. if nameFull = hello, ["e", "o"] is the result)

2 个答案:

答案 0 :(得分:2)

nameFull传递给filter会导致字符串的每个字符作为lambda发送到x[0]内部是多余的,没有必要;它只抓取x的第一个字符,它已经是一个单字符串。您应该删除它以便于阅读。

以下是演示:

>>> nameFull = input("Please enter your name: ")
Please enter your name: Robert
>>> 
>>> print(list(filter(lambda x: x in "aeiou", nameFull))) # Works fine without [0].
['o', 'e']
>>>
>>> 'a'[0] # [0] does nothing.
'a'
>>> 'a'[0] == 'a'
True
>>> 

答案 1 :(得分:1)

此处filter功能会过滤元音字符

filter(lambda x: x[0] in "aeiou", nameFull)

示例:nameFull ='hello'

第1步:

lambda x:x[0] in "aeiou", 'hello'

在此步骤中,x[0]h。因此条件失败为h而不是aeiou

第二步:

lambda x:x[0] in "aeiou", 'ello'

在此步骤中,x[0]e。因此eaeiou的条件为真。它被过滤了。

对于字符串中的其他字符也是如此。

最后,过滤后的转换为list

list(filter(lambda x: x[0] in "aeiou", nameFull))

输入:

hello

输出:

['e','o']