2010-12-12 102 views
1

我的代码是下一个:Python中,概率

with open("test.txt") as f_in: 
    for line in f_in: 
     for char in line: 
      frequencies[char] += 1 

list= [(count, char) for char, count in frequencies.iteritems()] 

此代码开放的test.txt,读每一行和 “列表” 登入形式例如:[(3, 'A'), .........]。这意味着,在整个文本文件中,有三个等...

我需要的是来计算这个数字,而不是,我需要[所有迹象的3 /数字]。所以我不需要在文本中有多少符号例如a,但是我需要符号a的概率。

因此,如果在文本(test.txt的)会有“AAAB”,我需要 “列表” 的输出:[(0.75, 'A'),(0.25, 'B')]

非常感谢您的帮助。


EDIT2

import collections 
frequencies = collections.defaultdict(int) 



with open("test.txt") as f_in: 
    for line in f_in: 
     for char in line: 
      frequencies[char] += 1 
total = float(sum(frequencies.keys())) 

verj= [(count/total, char) for char, count in frequencies.iteritems()] 

这不工作,给我的错误:

total = float(sum(frequencies.keys())) 

TypeError: unsupported operand type(s) for +: 'int' and 'str'

+1

我假设你正在初始化'frequencies'到'0'值?考虑使用[collections.defaultdict](http://docs.python.org/library/collections.html#collections.defaultdict)。 – delnan 2010-12-12 14:52:19

+0

这应该是编辑中的'frequencies.values()'行,而不是'frequencies.keys()'。毕竟,这是字典中存储事件数量的值。 (键存储字符符号。) – 2010-12-12 17:37:30

回答

1

如果frequencies = {"a": 3, "b": 4}然后frequencies.values()给我们[3, 4],我们可以计算的总和:

total = float(sum(frequencies.values())) 

然后概率:

probs = [(count/total, char) for char, count in frequencies.iteritems()] 

需要注意的是Python的划分两个整数的时候,这是我转换的总和为浮动第一的原因返回一个整数:

 
Python 2.7 (r27:82508, Jul 3 2010, 21:12:11) 
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> 3/4 
0 
>>> 3/4.0 
0.75 
+0

好吧,我明白这一点,但Python给了我一个错误: total = float(sum(frequencies.keys())) TypeError:不支持的操作数类型为+:' int'和'str' – thaking 2010-12-12 15:14:54

+0

是的,因为你正在总结**键**(字母)而不是**值**(计数)。你不能将字母添加到字母:) – SimonJ 2010-12-12 15:16:27

+0

请看编辑2,你能修复这个代码,所以它会工作吗? 非常感谢 – thaking 2010-12-12 15:19:38

1

你差不多了。

with open("test.txt") as f_in: 
    for line in f_in: 
     for char in line: 
      frequencies[char] += 1 
total = float(sum(frequencies.values())) 
symbols = [(count/total, char) for char, count in frequencies.iteritems()] 

请注意,我已经改名为你的结果列表,因为list是一个内置的名字,你不应该用它来命名变量或函数。

+0

您需要总结这些值,而不是键。此外,如果数字是整数,那么您需要将'float()'应用于总数,以便除法产生一个浮点数。 – SimonJ 2010-12-12 14:56:04

+0

total = sum(frequencies.keys()) TypeError:不支持的操作数类型为+:'int'和'str' --->错误,不起作用 – thaking 2010-12-12 14:58:36

+0

正确。求和的值而不是键,当你在它的时候,应用'float()'到和的结果,否则所有的概率将舍入到零。 – SimonJ 2010-12-12 15:02:19

0

快速和肮脏的:

counter = 0 
    with open("test.txt") as f_in: 
     for line in f_in: 
      for char in line: 
       frequencies[char] += 1 
       counter += 1 

    list= [(count/counter, char) for char, count in frequencies.iteritems()] 
+3

'/ \ + \ +/\ + = 1 /'。 – delnan 2010-12-12 14:49:02

+0

它给我一个错误在计数器++“无效的语法” – thaking 2010-12-12 15:01:29

+0

我不知道问题在哪里? – thaking 2010-12-12 15:10:22