2010-12-12 3 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, 'а'), .........]. Это означает, что в целом текстовой файл, есть три а и так далее ...

Что мне нужно, чтобы вычислить для этого числа, вместо 3, мне нужно [3/числа всех знак]. Поэтому мне не нужно число, сколько знака, например, есть в тексте, но мне нужна вероятность знака a.

Так что, если в тексте (test.txt) будет "AAAB", мне нужен выход "список": [(0,75, 'а'), (0,25, 'б')]

Большое спасибо за помощь.


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' ценности? Подумайте об использовании [collection.defaultdict] (http://docs.python.org/library/collections.html#collections.defaultdict). – delnan

+0

Это должно быть 'frequency.values ​​()' в строке в редактировании, а не 'frequency.keys()'. В конце концов, это значения этого dict, где хранится количество вхождений. (Клавиши хранят символы символов.) –

ответ

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 (frequency.keys())) TypeError: неподдерживаемый тип операндов для +: ' int 'и' str ' – thaking

+0

Да, потому что вы суммируете ** клавиши ** (буквы) вместо ** значений ** (количество). Вы не можете добавлять письма в письма :) – SimonJ

+0

Пожалуйста, посмотрите на edit 2, можете ли вы исправить этот код, чтобы он работал? Большое спасибо – thaking

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()' к сумме, так что деление создает float. – SimonJ

+0

общая сумма = (frequencies.keys()) TypeError: неподдерживаемый тип операнда (ов) для +: 'Int' и 'ул' ---> ошибка, не работает – thaking

+0

точно. Суммируйте значения вместо ключей и, пока вы на нем, примените 'float()' к результату суммы, иначе все ваши вероятности округлятся до нуля. – SimonJ

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

+0

Это дает мне ошибку на счетчике ++ "Недействительный синтаксис" – thaking

+0

Я не знаю, где проблема? – thaking

Смежные вопросы