【问题标题】:Vowel list: weird lambda expression元音列表:奇怪的 lambda 表达式
【发布时间】:2018-10-30 10:13:28
【问题描述】:

有人能解释一下为什么下面的代码会产生一个元音列表吗?似乎 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)

【问题讨论】:

    标签: python list lambda filter


    【解决方案1】:

    nameFull 传递给filter 将导致字符串的每个单独字符作为x 发送到lambda。里面的[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
    >>> 
    

    【讨论】:

    • 感谢您的帮助!为什么字符串的每个单独字符都将作为“x”发送?我认为 lambda 会将 'x' 设为 nameFull。
    • 不,因为filter 的第二个参数始终是一个可迭代的,它将发送和过滤其每个元素。字符串在 Python 中也是可迭代的(它们的字符就是它们的元素)。因此,该命令会像过滤任何其他可迭代的字符串一样过滤字符串。
    • 非常感谢!
    【解决方案2】:

    这里filter 函数过滤元音字符

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

    示例:nameFull = '你好'

    第一步:

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

    在这一步中x[0]h。所以条件失败为h not in aeiou

    第二步:

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

    在这一步中x[0]e。因此,aeiou 中的e 条件为真。已过滤。

    对字符串中的其他字符也一样。

    最后过滤后的转换成list

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

    输入:

    hello
    

    输出:

    ['e', 'o']

    【讨论】:

    • @Ryan Stanfield:您需要任何步骤的任何信息吗?
    猜你喜欢
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多