【问题标题】:How do I find character frequency form text file through iteration? (python3)如何通过迭代从文本文件中找到字符频率? (python3)
【发布时间】:2021-02-01 05:36:14
【问题描述】:

我正在尝试找到一种方法来遍历文本文件和列表以查找字符频率。我知道我可以为此使用 Count() 。但是 Count() 给出了一切,包括空格句号和诸如此类的东西。它也没有按字母顺序显示字符频率。我找到了一种方法,它有效,但不是真的。我稍后会解释。此外,当我尝试输入频率时,我得到一个 KeyError。我也会解释的。

我不想把我的整个项目都放在这里,所以我先解释一下。我有一个名为alphabet_list 的单独列表,其中包括字母表。有一个文本文件已被读取并转换为大写,名为 new_text。

字符频率代码:

for i in range(len(alphabet_list)):
    for c in new_text:
        if c == alphabet_list[i]:
            count += 1
        else:
            count = 0

    print(alphbet_list[i] + " " + str(count)        
    i += 1

输出

A 0
A 0
.
.
.
A 1
A 0
.
.
.
B 0
.
.
.
B 1
B 2
B 0
.
.
.
Z 0

P.S str(count) 暂时存在,因为我想看看打印出来的样子,我需要将结果存储在字典中

我的输出是这样的,就像我说的那样有效,但不是真的。它会迭代,但它会迭代每个字母并已经打印出结果,并且不会迭代整个文本文件而只打印最终结果。如果有另一个与以前相同的字母彼此相邻,它将添加到结果中。 Ex (... bb...) 它将是 B 1, B 2 ,如我的输出中所示。由于某种原因,当我使用 return 它不起作用。它什么也不返回,只是结束程序。

KeyError 的第二个代码:

  • 我跳过了上面的问题,因为我找不到答案,也不想浪费我的时间,但遇到了另一个问题,哈哈*
for i in range(len(alphabet_list)):
    for c in new_text:
        if c == alphabet_list[i]:
            count += 1
        else:
            count = 0
    c_freq[alphabet_list[i]] == count
    print(c_freq)        
    i += 1

这个很简单,我得到了一个 KeyError: 'A'。 我试着只做

i = 3 #just random number to test
count = 50
c_freq[alphabet_list[i]] == count
print(c_freq)

它有效,所以我认为这个问题也与上述问题有关(?也许)。无论如何,任何帮助都会很棒。谢谢!

抱歉,问题太长了,但我真的需要帮助。

【问题讨论】:

    标签: python-3.x list dictionary for-loop keyerror


    【解决方案1】:

    这应该对你有帮助:

    lst = ['A', 'Z', 'H', 'A', 'B', 'N', 'H', 'Y', '.' , ',','Z'] #Initial list. Note: The list also includes characters such as commas and full stops.
    
    alpha_dict = {}
    
    for ch in lst:
        if ch.isalpha(): #Checks if the character is an alphabet
            if ch in alpha_dict.keys():
                alpha_dict[ch] += 1 #If key already exists, value is incremented by 1
            else:
                alpha_dict[ch] = 1 #If key does not exist, a new key is created with value 1
    
    print(alpha_dict)
    

    输出:

    {'A': 2, 'Z': 2, 'H': 2, 'B': 1, 'N': 1, 'Y': 1}
    

    由于您希望输出按字母顺序排序,请将这些行添加到您的代码中:

    key_list = list(alpha_dict.keys()) #Creates a list of all the keys in the dict
    
    key_list.sort() #Sorts the list in alphabetical order
    
    final_dict = {}
    
    for key in key_list:
        final_dict[key] = alpha_dict[key]
    
    print(final_dict)
    

    输出:

    {'A': 2, 'B': 1, 'H': 2, 'N': 1, 'Y': 1, 'Z': 2}
    

    因此,这是最终的代码:

    lst = ['A', 'Z', 'H', 'A', 'B', 'N', 'H', 'Y', '.' , ',','Z']
    
    alpha_dict = {}
    
    for ch in lst:
        if ch.isalpha():
            if ch in alpha_dict.keys():
                alpha_dict[ch] += 1
            else:
                alpha_dict[ch] = 1
    
    key_list = list(alpha_dict.keys())
    
    key_list.sort()
    
    final_dict = {}
    
    for key in key_list:
        final_dict[key] = alpha_dict[key]
    
    print(final_dict)
    

    输出:

    {'A': 2, 'B': 1, 'H': 2, 'N': 1, 'Y': 1, 'Z': 2}
    

    【讨论】:

    • 是的!它有效,非常感谢。我试图支持您的回答,但它不允许我这样做,因为我刚刚创建了这个帐户并且声望不到 15。 (我是编程和堆栈的新手)但是当我有 15 名声望时,我一定会回来并支持你的答案。再次,谢谢你!!!你是救生员!!!
    • YW!一个来自我身边的卑微请求。您能接受我的回答作为最佳答案吗?您可以通过单击 upvote 按钮下方的绿色刻度线来完成。很高兴为您提供帮助!
    • 很抱歉再次打扰您,但我使用不同的文本文件再次尝试了该代码,它还读取带有重音符号的字母。有没有办法只阅读字母 A-Z。 {'A': 202723, ...'Z': 2388, 'À': 32, 'Á': 3059, 'Â': 12, 'Ä': 6, 'Æ': 1, 'Ç': 7,'È':267,'É':1127,'Ê':23,'Ë':240,'Í':1979,'Î':3,'Ï':39,'Ó':2765, 'Ô': 4, 'Ö': 35, 'Ú': 977, 'Ü': 58, 'Ý': 32, 'Œ': 3} 这就是我得到的输出。
    • 是的!工作完美。太感谢了!我还用绿色检查标记了您的答案,并且一定会回来投票!!!
    • 您好,刚刚投了赞成票。如果问题不大,您可以查看我刚刚发布的问题并提供一些建议。这有点类似于这个问题。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2021-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多