【问题标题】:Letter frequency in pythonpython中的字母频率
【发布时间】:2011-02-28 23:39:43
【问题描述】:

我需要编写一个程序来打印文本中字母的频率 文件并将该频率与 python 中的另一个频率进行比较。

到目前为止,我可以打印一个字母出现的次数,但是 我得到的百分比频率是错误的。我认为这是因为我需要我的程序只计算 通过删除所有空格和其他文件中的字母数 人物。

def addLetter (x):
    result = ord(x) - ord(a)
    return result


#start of the main program
#prompt user for a file

while True:
    speech = raw_input("Enter file name:")

    wholeFile = open(speech, 'r+').read()
    lowlet = wholeFile.lower()
    letters= list(lowlet)
    alpha = list('abcdefghijklmnopqrstuvwxyz')
    n = len(letters)
    f = float(n)
    occurrences = {}
    d = {}


    #number of letters
    for x in alpha:
        occurrences[x] = letters.count(x)
        d[x] =(occurrences[x])/f
    for x in occurrences:
        print x, occurrences[x], d[x]

这是输出

Enter file name:dems.txt
a 993 0.0687863674148
c 350 0.0242449431976
b 174 0.0120532003325
e 1406 0.0973954003879
d 430 0.0297866444999
g 219 0.015170407315
f 212 0.0146855084511
i 754 0.0522305347742
h 594 0.0411471321696
k 81 0.00561097256858
j 12 0.000831255195345
m 273 0.0189110556941
l 442 0.0306178996952
o 885 0.0613050706567
n 810 0.0561097256858
q 9 0.000623441396509
p 215 0.0148933222499
s 672 0.0465502909393
r 637 0.0441257966196
u 305 0.021127736215
t 1175 0.0813937378775
w 334 0.0231366029371
v 104 0.00720421169299
y 212 0.0146855084511
x 13 0.000900526461624
z 6 0.000415627597672
Enter file name:

该程序确实按列打印,但我不确定如何在此处显示。

“a”的频率应该是 0.0878

【问题讨论】:

  • 这是家庭作业吗?
  • 您的“f”变量包含列表的总长度,而不是列表中的字母字符数。另外 - 不要使用 SO 作弊。如果你自己不学,你永远学不会。
  • 是的,这是一个硬件任务。我不是想作弊。我只是走到了死胡同,需要一些方向。感谢您的所有帮助。

标签: python


【解决方案1】:
import collections
import re
from __future__ import division

file1 = re.subn(r"\W", "", open("file1.txt", "r").read())[0].lower()
counter1 = collections.Counter(file1)
for k, v in counter1.iteritems():
   counter1[k] = v / len(file1)

file2 = re.subn(r"\W", "", open("file2.txt", "r").read())[0].lower()
counter2 = collections.Counter(file2)
for k, v in counter2.iteritems():
   counter2[k] = v / len(file2)

注意:需要 Python 2.7。

【讨论】:

    【解决方案2】:

    您可以使用translator recipe 删除所有不在alpha 中的字符。 因为这样做会使letters 只包含来自alpha 的字符,所以n 现在是正确的分母。

    然后您可以使用collections.defaultdict(int) 来计算字母的出现次数:

    import collections
    import string
    
    def translator(frm='', to='', delete='', keep=None):
        # Python Cookbook Recipe 1.9
        # Chris Perkins, Raymond Hettinger
        if len(to) == 1: to = to * len(frm)
        trans = string.maketrans(frm, to)
        if keep is not None:
            allchars = string.maketrans('', '')
            # delete is expanded to delete everything except
            # what is mentioned in set(keep)-set(delete)
            delete = allchars.translate(allchars, keep.translate(allchars, delete))
        def translate(s):
            return s.translate(trans, delete)
        return translate
    
    alpha = 'abcdefghijklmnopqrstuvwxyz'
    keep_alpha=translator(keep=alpha)
    
    while True:
        speech = raw_input("Enter file name:")
        wholeFile = open(speech, 'r+').read()
        lowlet = wholeFile.lower()
        letters = keep_alpha(lowlet)
        n = len(letters)
        occurrences = collections.defaultdict(int)    
        for x in letters:
            occurrences[x]+=1
        for x in occurrences:
            print x, occurrences[x], occurrences[x]/float(n)
    

    【讨论】:

    【解决方案3】:

    我认为这是一种非常直接的方法:

    while True:
        speech = raw_input("Enter file name:")
    
        wholeFile = open(speech, 'r+').read()
        lowlet = wholeFile.lower()
    
        alphas = 'abcdefghijklmnopqrstuvwxyz'
    
        # lets set default values first
        occurrences = {letter : 0 for letter in alphas }
        # occurrences = dict(zip(alphas, [0]*len(alphas))) # for python<=2.6
    
        # total number of valid letters
        total = 0
    
        # iter everything in the text
        for letter in lowlet:
            # if it is a valid letter then it is in occurrences
            if letter in occurrences:
                # update counts
                total += 1
                occurrences[letter] += 1
    
        # now print the results:
        for letter, count in occurrences.iteritems():
            print letter, (1.0*count/total)
    

    您注意到,在计算频率之前,您需要文本中有效字母的总数。要么在处理之前过滤文本,要么将过滤与处理结合起来,这就是我在这里所做的。

    【讨论】:

    • 感谢您的帮助。我不知道如何过滤掉我不需要的东西。您的方法使用了我们不允许使用的字典。我能够使用 unutbu 的方法。
    • @SimplyZ:你确定吗?您使用了两本字典。
    • 是的,感谢您指出这一点。我之前没有注意到这一点。
    • @SimplyZ:那么您可能应该使用一个列表,其中freq[0] 代表afreq[1] 代表b 等等...
    猜你喜欢
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-19
    • 2017-04-20
    相关资源
    最近更新 更多