2012-04-03 12 views
-6
f=open('new.txt') 
var=f.read() 
var=var.lower() 
var = var.replace(';','') 
var = var.replace(',','') 
var = var.replace('.','') 
x=var.split() 
dict={} 
dictList=[] 
dict2={} 
for i in xrange(0,len(x)-1): 

    if dict.items(): 
     for k in dict.items(): 
      if x[i] not in k: 

       dict[x[i]]=dict2 
       dict2[x[i+1]]=1 

      else: 
       if dict[x[i]].keys(): 
        if x[i+1] in dict[x[i]].keys(): 
         dict[x[i]][x[i+1]]+=1 
        else: 
         dict[x[i]][x[i+1]]=1 
       else: 
        dict[x[i]][x[i+1]]=1 

    else: 

     dict[x[i]]=dict2 
     dict2[x[i+1]]=1 

print dict 

Dieser Code muss Bigramm-Zähler für jedes Wort drucken. Ich bin mir ziemlich sicher, dass ich dict2 unangemessen instanziiert habe. Ich bin sicher, das ist ein naive Fehler, aber ich vermisse es irgendwie. Irgendwelche Vorschläge? :)Wo ist dieser Code falsch?

+3

Welchen Fehler bekommen Sie? – PearsonArtPhoto

+3

"Irgendwelche Vorschläge?" Schreiben Sie ein minimales Beispiel, das das Problem aufweist. –

+0

Was meinst du mit "Bigryrählungen jedes Wortes drucken"? Können Sie ein Beispiel new.txt angeben und was sollte die Ausgabe sein? –

Antwort

2

Wenn ich diesen Code Refactoring, ich aussehen würde:

  • Variablennamen. Namen wie dict sagen dem Coder/Maintainer nichts. Und was ist der Unterschied zwischen dict und dict2? Sie wissen vielleicht heute, aber morgen ... vielleicht nicht
  • verschachtelt für/wenn/für/wenn/wenn. Es ist sehr schwierig, alle Pfade zu verfolgen und sicherzustellen, dass es keine möglichen Fehler gibt. Ich würde es in separate Funktionen aufteilen, die unabhängig voneinander getestet und getestet werden können.
  • Datenstrukturen. Sie sind oft der Kern eines Programms. Aber hier, was sind sie? Es ist nicht offensichtlich für mich, was bedeutet, dass es nicht offensichtlich ist, was/warum der Code irgendetwas tut
  • Fehlerbehandlung. Welche Fehler sind möglich/erwartet? Welche werden behandelt/ignoriert?
+2

Verwenden Sie nicht "dict", weil es mit der integrierten Wörterbuchklasse kollidiert (und diese überschreibt). – rplnt

+0

Guter Punkt. Selbe mit 'list',' int' ... –

+0

Ich würde hinzufügen, dass 'für i in xrange (...):' ist nicht der pythonische Weg, eine Sammlung von Dingen zu verarbeiten. Schleifen Sie die Sammlung stattdessen direkt, oder verwenden Sie 'enumerate()', wenn Sie die Sequenznummer des zu verarbeitenden Elements kennen müssen. –