【问题标题】:find number of vowels in a string查找字符串中元音的数量
【发布时间】:2019-02-26 17:42:01
【问题描述】:

我有一串字母作为输入。
输入:

my_str = 'soumendra_in_stackoverflow'

我想要如下所示的输出。所有元音都应与字典中的相应计数一起打印。
需要输出

{'a': 2, 'e': 2, 'i': 1, 'o': 3, 'u': 1}

为此,我编写了以下程序:

ans_dict = {}
for letter in my_str:
    if letter in ['a', 'e', 'i', 'o', 'u']:
        ans_dict[letter] = ans_dict.get(letter, 0) + 1
print(ans_dict)

它有效。但是,如何在不使用collections.Counter 的情况下在一行中编写相同的逻辑(可能使用字典理解)?
我已经尝试过了,但它失败了。

{x: + 1 for x in a if x in ['a', 'e', 'i', 'o', 'u'] }

【问题讨论】:

  • 为什么不使用Counter?看起来是最好的工具。您可以使用字典理解来做到这一点,但结果是您将迭代字符串 次,使其效率降低
  • stackoverflow.com/questions/12833512/… 查看第一个和第二个答案。
  • stackoverflow.com/questions/12833512/… 查看第一个和第二个答案。
  • @Gozzah:我认为链接的问题解决了一个不同的问题:这里我们感兴趣的是字符串中元音的 number 个,而不是列表中的字符串 (!)以元音开头。是的,有一些重叠,但两者在严格意义上是“不同”的问题。

标签: python dictionary-comprehension


【解决方案1】:

您可以使用str.count,从而编写字典理解:

result = { v: my_str.count(v) for v in "aeiou" }

但这会导致枚举my_str 次。然而,就像@DSM 所说,.count(..) 通常工作得相当快(我的猜测是它是在解释器级别实现的,因此它不必“迭代”集合)。

我个人认为Counter 会更好,因为

  1. 它是专为计算事物而设计的,此外,它将数据包装到一个强制约束的接口中(除非Counter 中存在错误,否则计数肯定是正确的,而定制算法仍然可能有一个“愚蠢”的错误,是的,这是不太可能的,但最好避免这种情况);和
  2. 它提供了一个很好的界面来用这些计数做各种事情(例如counter1 & counter2 将构造一个新的Counter,每个元素的最小计数)。

【讨论】:

  • 请注意,“五”可能是错误的强调; count 是如此之快,以至于在少量键的情况下,使用count 实际上更有效。只有五个,它在长弦上快了一个数量级。概念上的论据更强大(尽管即使在那里它们也变得模糊不清——例如,我们都会写some_str.count(","),而不是Counter(some_str)[","]。)
  • @DSM:我认为.count(..) 确实更快,因为它是在 interpreter 级别(以及 Python 字符串的定义)实现的。但是如果我们不需要的话,我真的不喜欢在一个集合上“迭代多次”:)。就“big oh”而言,它将缩放为 O(mn),这意味着如果我们必须计算的字符数相当大(例如所有中文 unicode 字符),它将导致一个瓶颈。但是你是对的,对于元音,这可能更快,或者差别不大)。
猜你喜欢
  • 2021-11-02
  • 1970-01-01
  • 2011-09-05
  • 1970-01-01
  • 1970-01-01
  • 2016-08-09
  • 2017-02-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多