gpt4 book ai didi

Python Lambda 实践

转载 作者:太空宇宙 更新时间:2023-11-03 12:38:46 27 4
gpt4 key购买 nike

我们的目标是搜索用户输入的字符串并计算在其中找到多少元音。不幸的是我被困在这里,有什么帮助吗?

def numVowels(s):
vowels= "AEIOUaeiou"
if s == '':
return 0
else:
totalVowels = list(filter(lambda vowels:sum("AEIOUaeiou"), s))
print(len((totalVowels)))

最佳答案

我将成对展示三种方法,每次通过 lambda 进行然后通过等效的生成器表达式。重要的是要理解生成器表达式(和列表推导式)只是一对 map 的语法糖。和 filter操作,并且可以机械地来回平移。然而,表达/理解方式通常被认为更 Pythonic。

解决这样的问题的关键是你必须弄清楚你想在过滤器中做什么以及你想在 map 中做什么。也就是说:您必须能够编写查看一个元素并决定是否包含它的代码;以及查看一个元素并将其转换为更有用的值的代码。

所以在我们展示代码之前,让我们确保我们可以:

  • 给定一个字母,判断它是否包含在我们的 vowels 中字符串。这是微不足道的:我们可以从字面上问 Python 是否 letter in vowels (假设 letter 是一些变量 - 但要注意 vowels 是一个字符串,这会进行子字符串搜索;您应该先将 vowels 转换为 set)。制作 lambda除此之外,我们简单地写:lambda letter: letter in vowels . (我们可以在这里使用我们喜欢的任何变量名:这与编写函数相同。)
  • 给定一封信,将其翻译成 1如果是元音,并且是 0除此以外。实际上,使用 letter in vowels结果也同样有效,因为它返回 TrueFalse , 这些可用作数值 10分别。取决于你如何解释 Python 公理 explicit is better than implicit ,你可能更喜欢写 int(letter in vowels) ,甚至 1 if letter in vowels else 0 .为了减少示例的数量,我将使用 letter in vowels ,即使在我自己的代码中我喜欢最后一个 :)

  • 另外,让我们简化一下。正如我之前提到的,我们的 vowels应该是 set .我只会在这里展示一次: vowels = set("AEIOUaeiou") .下面显示的函数自然地假设它是一个全局的 ;) 最后,请注意没有理由以不同的方式对待空字符串。你可以完美地迭代一个空字符串,找到没有元素,将它们相加为 0,找到它的长度为 0,等等。它根本不会改变逻辑。 Special cases aren't special enough .

    继续完整代码。

    我们可以做您想做的事情,即:包含元音元素,并且不执行任何转换 - 通过生成的元音列表的长度确定结果。
    def vowels_by_filter(string):
    return len(filter(lambda letter: letter in vowels, string))

    def vowels_by_filter_expression(string):
    return len(letter for letter in string if letter in vowels)

    或者我们可以将所有字母转换为 10 (即每个字母包含的“元音数”),并将结果相加:
    def vowels_by_map(string):
    return sum(map(lambda letter: letter in vowels, string))

    def vowels_by_map_expression(string):
    return sum(letter in vowels for letter in string)

    或者我们可以结合这些方法——只包含元音元素,然后将它们转换为 1(因为我们包含的所有元素都是元音,它必须转换为 1,我们不需要再次检查值):
    def vowels_by_both(string):
    return sum(map(lambda letter: 1, filter(lambda letter: letter in vowels, string)))

    def vowels_by_full_expression(string):
    return sum(1 for letter in string if letter in vowels)

    每对中的等价性应该是相当明显的。使用生成器表达式(或列表推导式), for 之前的部分是我们的 map , 以及结尾 if 之后的部分(如果包含)是我们的 filter .我们总是必须用这些写一个“映射”(即使转换相当于 lambda x: x ),但它使我们不必写出完整的 lambda语法,并且当存在时,我们对“map”和“filter”使用相同的自由变量(即,我们的迭代变量, letter 中的 for letter in string )。

    关于Python Lambda 实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32572791/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com