2010-12-12 79 views
1

Mon code est suivante:Python, la probabilité

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()] 

Ce code ouvert test.txt, lisez chaque ligne et de signer "liste" en forme par exemple: [(3, 'a'), .........]. Cela signifie que dans un fichier texte entier, il y a trois a et ainsi de suite ...

Ce que je dois est de calculer pour ce numéro, au lieu , j'ai besoin [3/nombre de tous les signes]. Donc je n'ai pas besoin de nombre de signes comme par exemple a dans le texte, mais j'ai besoin de probabilité de signe a.

Donc, si dans le texte (test.txt) il y aura "aaab", j'ai besoin sortie de "liste": [(0,75, 'a'), (0,25, 'b')]

Un grand merci pour votre aide.


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()] 

Ce ne fonctionne pas, donnez-moi l'erreur:

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

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

+1

Je suppose que vous êtes 'initialiser frequencies' pour les valeurs '0'? Pensez à utiliser [collections.defaultdict] (http://docs.python.org/library/collections.html#collections.defaultdict). – delnan

+0

Cela devrait être 'fréquences.values ​​()' sur la ligne dans l'édition, pas 'fréquences.keys()'. Après tout, ce sont les valeurs de cette dict où le nombre d'occurrences est stocké. (Les clés stockent les symboles de caractères.) –

Répondre

1

Si frequencies = {"a": 3, "b": 4} puis frequencies.values() nous donne [3, 4] et nous pouvons calculer la somme:

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

puis les probabilités:

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

Notez que Python renvoie un nombre entier lors de la division deux entiers, ce qui était la raison pour laquelle je me suis converti la somme en un flotteur premier:

 
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

OK, je comprends cela, mais python me donne une erreur: total = float (sum (fréquences.keys())) TypeError: type (s) d'opérande non supporté (s) pour +: ' int 'et' str ' – thaking

+0

Oui, car vous additionnez les ** clés ** (lettres) au lieu des ** valeurs ** (nombre). Vous ne pouvez pas ajouter de lettres aux lettres :) – SimonJ

+0

Veuillez regarder l'édition 2, pouvez-vous corriger ce code pour que cela fonctionne? Un grand merci – thaking

1

Vous êtes presque là.

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()] 

Notez que j'ai renommé votre liste résultante parce list est le nom d'un intégré et vous ne devriez pas l'utiliser pour nommer des variables ou des fonctions.

+0

Vous devez additionner les valeurs, pas les clés. De plus, si les nombres sont des entiers, vous devrez appliquer 'float()' au total pour que la division produise un float. – SimonJ

+0

totale = somme (frequencies.keys()) TypeError: type d'opérande non supporté (s) pour +: 'int' et 'str' ---> erreur, ne fonctionne pas – thaking

+0

Exactement. Additionnez les valeurs au lieu des clés et, pendant que vous y êtes, appliquez 'float()' au résultat de la somme sinon toutes vos probabilités arrondiront à zéro. – SimonJ

0

rapide et sale:

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

Il me donne une erreur au compteur ++ "syntaxe invalide" – thaking

+0

Je ne sais pas où est le problème? – thaking