【问题标题】:Python: Counting Vowels from ListPython:从列表中计算元音
【发布时间】:2016-02-13 06:53:24
【问题描述】:

我是 python 新手,对我的脚本进行故障排除有些困难。

我的任务是创建一些函数来接受字符串列表并返回整个列表中元音的数量。

我正在尝试遵循的游戏计划是:

  1. 将列表元素合并为一个字符串
  2. 创建一个循环来测试字符串元素是否为元音
  3. 使用计数器变量来跟踪字符串中的元音
  4. 循环结束后打印计数器变量的值

我的代码并不优雅,但它也不起作用。

def vowelCounter(listName):
    new = ''.join(listName)
    n = len(new)
    count = 0
    vowels = 'aeiouAEIOU'
    i = 0
    for i in range(0,n):
        while i < n:
            if new[i] in vowels:
                count += 1
                i += 1
                return
            print count
            return
        return
    return

print(vowelCounter(["terrapin","station","13points"]))

请原谅我可能犯的任何愚蠢错误。我一定会感谢您提供的任何帮助!

【问题讨论】:

标签: python


【解决方案1】:

首先,我们有一些一般的语法问题。

  1. return 立即退出函数;它不仅仅是“结束循环”。
  2. 在循环上方将i 初始化为0 毫无意义。 for 循环本身只会自动将 i 设置为 range() 返回的列表中的当前值。
  3. while i &lt; n 是不必要的;无需为列表中的每个字符再次循环遍历字符串。
  4. 无需手动递增ifor 会自动为您执行此操作。
  5. 您正在 printing 函数内部的值,但您还尝试打印函数的返回值(但它不返回任何内容!)。

所以,如果我们解决了这些问题,我们会得到这样的结果:

def vowelCounter(listName):
    vowels = 'aeiouAEIOU'
    new = ''.join(listName)
    count = 0

    for i in range(0, len(new)):
        if new[i] in vowels:
            count += 1

    return count

但 Python 也允许 for 循环遍历字符串的每个字符,因此我们根本不需要 range()len()

def vowelCounter(listName):
    vowels = 'aeiouAEIOU'
    count = 0

    for char in ''.join(listName):
        if char in vowels:
            count += 1

    return count

但我们可以通过List Comprehensionssum() 函数让这个变得更棒!

def vowelCounter(listName):
    vowels = 'aeiouAEIOU'
    count = sum([1 for char in ''.join(listName) if char in vowels])
    return count

我们在这里基本上做的是为每个元音字母制作一个1s 列表(如果它不是元音,我们不会在新列表中添加任何内容)。然后我们使用sum() 将列表中的所有数字(1)相加,即我们的元音总数。

或者我们甚至可以将其设为单行:

def vowelCounter(listName):
    return sum([1 for char in ''.join(listName) if char in 'aeiouAEIOU'])

【讨论】:

  • 谈优雅...感谢您的精彩解释!
  • 没问题,谢谢,很高兴为您提供帮助! Python 非常灵活且富有表现力,总有一些正确的方法,但目标通常是找到一种简单、高效且可读的正确组合。不过,我们绝对是在正确的轨道上!
  • @MattD 如果您认为这个答案很好,足够,而且正确(当然),您应该继续接受它,:)
【解决方案2】:

您提供的分步逻辑是正确的。
但是,您发布的代码不符合逻辑,不正确。

试试下面的代码:

def vowelCounter(listName):
    string = ''.join(listName)
    count = 0
    vowels = 'aeiouAEIOU'
    for ch in string:
        if ch in vowels:
            count += 1
    return count

print(vowelCounter(["terrapin","station","13points"]))

【讨论】:

  • 是否需要打印才能显示函数返回的值?
  • 是的,该函数返回元音计数。所以需要 print 来显示函数返回的值。
  • 但是,您可以直接从函数内部打印元音计数,方法是将最后一行 return count 替换为以下两行 print countreturn
【解决方案3】:

代码基本没问题...但是

  • for i in ... 自动递增i,因此不需要i += 1
  • for 执行循环...无需在其中放置另一个 while 循环
  • return 退出函数,你应该只在最后使用它来返回用 return count 计算的结果

【讨论】:

  • 感谢您快速而有帮助的回复!我会做出改变,看看我能解决什么问题。
  • 我闻到了老鼠的味道!即使是这个不错的小答案也会被否决。无论如何,我正在尽我所能,把它带到地球线上!
【解决方案4】:
>>> import re
>>> vowels = re.compile('[AEIOU]', re.IGNORECASE)
>>>
>>> def vowelCounter(listName):
...     return len(vowels.split("".join(listName)))-1
...
>>> vowelCounter(["terrapin","station","13points"])
8
>>> vowelCounter(["terrapin","station","13pOInts"])
8

【讨论】:

  • 漂亮!非常整洁和聪明。 +1,但 OP 可能想要更天真的答案:-)
  • 正则表达式对于此类问题也不是很有效。
猜你喜欢
  • 2022-08-13
  • 2023-02-25
  • 2018-01-14
  • 1970-01-01
  • 2019-03-13
  • 2013-11-26
  • 2011-05-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多