2010-12-12 5 views
1

Mein Code ist weiter:Python, Wahrscheinlichkeit

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

Dieser Code offen test.txt, jede Zeile und "Liste" in Form zum Beispiel unterzeichnen lesen: [(3, 'a'), .........]]. Dies bedeutet, dass in ganzer Textdatei gibt drei ein und so weiter ...

Was ich brauche, ist für diese Zahl zu berechnen, statt 3, ich brauche [3/Anzahl aller Zeichen]. Also brauche ich keine Anzahl von wie viele Zeichen zum Beispiel ein ist im Text, aber ich brauche die Wahrscheinlichkeit von Zeichen a.

Also, wenn in Text (test.txt) es wird "aaab", ich brauche Ausgabe von "Liste": [(0,75, 'a'), (0,25, 'b')]

Vielen Dank für Ihre Hilfe.


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

Dies funktioniert nicht, gib mir Fehler:

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

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

+1

Ich nehme an, Sie initialisieren 'frequencies' auf '0' Werte? Erwägen Sie die Verwendung von [collections.defaultdict] (http://docs.python.org/library/collections.html#collections.defaultdict). – delnan

+0

Das sollte 'frequencies.values ​​()' auf der Zeile im Edit sein, nicht 'frequency.keys()'. Schließlich sind es die Werte dieses Diktats, in denen die Anzahl der Vorkommen gespeichert ist. (Die Schlüssel speichern die Zeichensymbole.) –

Antwort

1

Wenn frequencies = {"a": 3, "b": 4} dann frequencies.values() gibt uns [3, 4] und wir die Summe berechnen:

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

und dann die Wahrscheinlichkeiten:

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

Beachten Sie, dass Python eine ganze Zahl zurückgibt, wenn zwei ganzen Zahlen dividiert, was der Grund dafür war ich die Summe in einem Schwimmer zuerst umgewandelt:

 
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, ich verstehe das, aber python gibt mir einen Fehler: total = float (Summe (frequencys.keys())) TypeError: nicht unterstützte Operandentyp (en) für +: ' int 'und' str ' – thaking

+0

Ja, weil Sie die ** Schlüssel ** (Buchstaben) anstelle der ** Werte ** (Zahlen) summieren. Sie können Buchstaben nicht Buchstaben hinzufügen :) – SimonJ

+0

Schauen Sie sich bitte bearbeiten 2, können Sie diesen Code reparieren, damit es funktioniert? Vielen Dank – thaking

1

Du bist fast dort.

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

Beachten Sie, dass ich Ihre Ergebnisliste umbenannt haben, weil list der Name eines eingebaut ist, und Sie sollten es nicht Variablen oder Funktionen Namen verwenden.

+0

Sie müssen die Werte summieren, nicht die Schlüssel. Auch wenn die Zahlen Integer sind, müssen Sie 'float()' auf die Summe anwenden, damit die Division einen Float erzeugt. – SimonJ

+0

total = sum (frequencies.keys()) Typeerror: Nicht unterstützter Operandentyp (e) für +: 'int' und 'str' ---> Fehler, nicht – thaking

+0

genau arbeiten. Summiere die Werte anstelle der Schlüssel und, während du dabei bist, trage 'float()' auf das Ergebnis der Summe, sonst werden alle deine Wahrscheinlichkeiten auf Null abgerundet. – SimonJ

0

Schnell und schmutzig:

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

Es gibt mir einen Fehler bei Zähler ++ "ungültige Syntax" – thaking

+0

Ich weiß nicht, wo ist das Problem? – thaking