查找字符串中的元音数量

Sou*_*dra 3 python dictionary-comprehension

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

my_str = 'soumendra_in_stackoverflow'
Run Code Online (Sandbox Code Playgroud)

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

{'a': 2, 'e': 2, 'i': 1, 'o': 3, 'u': 1}
Run Code Online (Sandbox Code Playgroud)

为此我写了以下程序:

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)
Run Code Online (Sandbox Code Playgroud)

有用.但是,如何在一行中编写相同的逻辑(可能使用字典理解)而不使用collections.Counter
我试过这个,但它失败了.

{x: + 1 for x in a if x in ['a', 'e', 'i', 'o', 'u'] }
Run Code Online (Sandbox Code Playgroud)

Wil*_*sem 7

您可以使用str.count并因此编写字典理解:

result = { v: my_str.count(v) for v in "aeiou" }
Run Code Online (Sandbox Code Playgroud)

但这导致my_str 五次计数.就像@DSM所说的那样,.count(..)通常工作得相当快(我的猜测是它是在解释器级别实现的,所以它不必在集合上"迭代").

就个人而言,我认为Counter这里会更好

  1. 它的设计完全是为了计算事物的目的,而且它将数据包装到一个强制约束的界面中(除非有一个错误Counter,计数肯定是正确的,而自定义算法仍然可以有一个"傻" "错误,是的,这是非常不可能的,但最好避免这种情况;" 和
  2. 它提供了一个很好的界面来处理这些计数的各种事情(例如,counter1 & counter2将构造一个新的Counter,具有每个元素的最小计数).

  • 请注意,"五"可能是压力的错误; count是如此之快,以至于在使用`count`时,使用少量键实际上更有效.只有五个,它在长琴弦上快一个数量级.概念论证更强(尽管它们在极限中变得模糊 - 我们都会写`some_str.count(",")`,而不是`Counter(some_str)[","]`,例如.) (3认同)