在一个字符串中计算一个字符出现的次数

7

我刚开始学习Python,正在构建一个程序来分析一组单词,并返回文本中每个字母出现次数,例如:'A:10,B:3,C:5...等等'。目前它完美地工作,只是我正在寻找一种方法来压缩代码,而不是重复编写26次程序的每个部分。以下是我的意思。

print("Enter text to be analyzed: ")
message = input()

A = 0
b = 0
c = 0
...etc

for letter in message:

    if letter == "a":
        a += 1
    if letter == "b":
        b += 1
    if letter == "c":
        c += 1
    ...etc

print("A:", a, "B:", b, "C:", c...etc)

1
使用字典代替 26 个变量。 - Wooble
2个回答

13

有很多方法可以做到这一点。大多数使用字典(dict)。例如,

count = {}
for letter in message:
    if letter in count:  # saw this letter before
        count[letter] += 1
    else:   # first time we've seen this - make its first dict entry
        count[letter] = 1

有更短的写法,我相信其他人会指出,但先学习这种方式直到理解。这遵循非常简单的操作。

最后,可以通过以下方式显示它(例如):

for letter in sorted(count):
    print(letter, count[letter])

再说一遍,有更短的方法可以做到这一点,但这种方法坚持使用非常基本的操作。


1
所以我们也可以将 if-else 语句替换为 count[letter] = count.setdefault(letter, 0) + 1。正确吗? - Grijesh Chauhan
2
是的,setdefault() 也可以很好地工作 - 那就是它的用途。但对于新手来说,这更难以理解,所以我在这里避免使用它 :-) - Tim Peters

12
你可以使用Counter,但@TimPeters可能是正确的,坚持使用基础功能更好。

你可以使用Counter,但 @TimPeters 可能是正确的,最好坚持使用基本功能。

from collections import Counter

c = Counter([letter for letter in message if letter.isalpha()])
for k, v in sorted(c.items()):
    print('{0}: {1}'.format(k, v))

3
您的回答非常出色!这就是Python专家所做的。我希望通过研究我的“坚持基础知识”的答案,帮助发帖者更多地了解Python语言——collections.Counter几乎可以通过魔法来解决整个问题;-) - Tim Peters
是的...我想现在我会坚持基础,但我想我可能会尝试一下这个!以后可能会有用。谢谢! - Kevin Arthur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接