【问题标题】:Python - How to count characters, but only print once?Python - 如何计算字符,但只打印一次?
【发布时间】:2017-11-08 19:10:00
【问题描述】:

我正在尝试找出我的代码。该代码的目标是创建一个字符频率计数器。字符频率计数器必须按字母顺序显示结果。因此,代码必须接受输入并显示字符数,如下所示:

输入 = ("苹果") 'a' = 1

'e' = 1

'l' = 1

'p' = 2

目前,我的代码是这样做的:

'a' = 1

'e' = 1

'l' = 1

'p' = 2

'p' = 2

有解决这个问题的想法吗?理想情况下,我只希望 'p' 显示一次,但同时计算两个字符。

这是我的代码:

char_dict = {}
user_input = input("Please enter a word or sentence: ")
user_input = user_input.replace(" ", "")
user_input = user_input.lower()
test_list = list(user_input)
test_list.sort()
for character in user_input:
    char_dict[character] = 0
for character in user_input:
    char_dict[character] = char_dict[character] + 1
for character in test_list:
    print (character, ":", char_dict[character])

非常感谢任何帮助。非常感谢!

【问题讨论】:

  • 非常感谢大家的回答!我的代码现在运行完美。真的不能感谢你们!

标签: python loops for-loop character frequency


【解决方案1】:

你有所有正确的部分,但问题实际上比你做的要简单:

user_input = input("Please enter a word or sentence: ")
user_input = user_input.replace(" ", "")
user_input = user_input.lower()

char_dict = {}

for character in user_input:
    char_dict[character] = char_dict.get(character, 0) + 1

for character in sorted(char_dict):
    print(character, ":", char_dict[character])

输出

> python3 test.py
Please enter a word or sentence: apple
a : 1
e : 1
l : 1
p : 2
>

【讨论】:

    【解决方案2】:

    这就是我将使用collections.Counter 和新奇的f-strings 编写程序的方式:

    from collections import Counter
    word = input("What is your word? ")
    letter_counts = Counter(word.lower())
    sorted_letter_counts = sorted(letter_counts.items())
    for letter, count in sorted_letter_counts:
        print(f"'{letter}' = {count}")
    

    【讨论】:

    • 无法正确控制大小写,尝试输入“Google”。
    • 我声称它为“Google”提供了正确答案,因为“G”和“g”不一样。但是,改变很容易:letter_counts = Counter(word.lower())
    • 仅基于 OP 的原始代码。显然是一个简单的修复。我喜欢 f 弦。
    • 已确认。谢谢。
    【解决方案3】:

    你也可以试试这个:

    string = "apple" #Input string
    string = string.replace(" ","").lower() #In case of whitespace
    setString = sorted(map(lambda i : [i,string.count(i)], set(string)))
    for i in setString:
        print("%s : %d" % (i[0],i[1]))
    

    输出:

    a : 1
    e : 1
    l : 1
    p : 2
    

    【讨论】:

    • 您似乎不需要致电list()
    【解决方案4】:

    也许您可以创建一些“使用过的符号”列表,然后在计算任何符号后,将其添加到列表中。

    usedsymb=[]
    for character in user_input:
        if usedsymb.count(character)==0:
            char_dict[character] +=1        (this will add 1)
            usedsymb.append(character)
    

    【讨论】:

    • char_dict.keys() 已经包含与usedsymb 相同的字符时,为什么还要这么麻烦?
    【解决方案5】:

    你得到'p'两次,因为你循环遍历单词'apple',其中有两次'p'。尝试遍历字典中已排序的键列表,因为每个字符只有一个唯一键。

    因此将第二行更改为最后一行,并删除一些不再需要的行:

    char_dict = {}
    user_input = input("Please enter a word or sentence: ")
    user_input = user_input.replace(" ", "")
    user_input = user_input.lower()
    
    for character in user_input:
        char_dict[character] = 0
    for character in user_input:
        char_dict[character] = char_dict[character] + 1
    for character in sorted(char_dict.keys()):
        print (character, ":", char_dict[character])
    

    【讨论】:

    • sorted(char_dict.keys()) -> sorted(char_dict)
    • @cdlane :我会坚持使用sorted(char_dict.keys()),谢谢。我在这样一个环境中工作,任何时候多达 200 人可能正在查看/编辑代码,而我们的编码标准规定,清晰是第一位的。当所有这意味着懒惰地不输入字符,因为它们不是 python 需要的,但为了读者清楚起见,我们特别不做读者在这里可能标记为“pythonic 方式”的事情。我明确地对由 keys() 运算符返回的键数组进行排序,我没有对字典进行排序,因为只检索了键而不是键值对。
    【解决方案6】:

    我能想到的一种更好的解决方案是在 Python 中使用 collections 包。它是一种设计模式。 collection 包有一个方法 Counter 可以解决你的问题。

    它非常简单易用。

    以下是它的代码块。

    input_string = "apple" from collections import Counter result = Counter([i for i in input_string]) print (result)

    这应该可以为您带来神奇的效果。使用设计模式通常会更好,因为它们会简化工作。

    使用计数器,您只需几行代码即可获得所需的结果。

    【讨论】:

    • 或者,更简单地说,第三行可以是result = Counter(input_string)
    • 确实如此。答案给出了这个想法的要点。一行代码即可。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    • 2019-11-18
    相关资源
    最近更新 更多