2010-12-12 104 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