2013-05-17 6 views
12

Der folgende Code gibt das Wort in der TXT-Datei aus, und wie viele Instanzen dieses Worts es gibt (z. B. a, 26), das Problem ist, dass es nicht in alphabetischer Reihenfolge ausgegeben wird Auftrag. Jede mögliche Hilfe würde vielAusgabe des Wörterbuchs in alphabetischer Reihenfolge zurückgeben

geschätzt werden
import re 
def print_word_counts(filename): 
    s=open(filename).read() 
    words=re.findall('[a-zA-Z]+', s) 
    e=[x.lower() for x in (words)] 
    e.sort() 
    from collections import Counter 
    dic=Counter(e) 
    for key,value in dic.items(): 
     print (key,value) 
print_word_counts('engltreaty.txt') 

Antwort

28

Sie müssen nur die Elemente sortieren. Der eingebaute sorted sollte wunderbar arbeiten:

for key,value in sorted(dic.items()): 
    ... 

Wenn Sie die e.sort() Linie fallen, dann sollte dies in etwa die gleiche Menge an Zeit. Der Grund dafür, dass es nicht funktioniert, ist, dass Wörterbücher auf hash Tabellen basieren, die Elemente in der Reihenfolge ihrer Hash-Werte speichern (mit etwas komplizierterem Zeug, wenn Hash-Kollisionen auftreten). Da die Hashing-Funktion niemals irgendwo angegeben ist, bedeutet dies, dass Sie nicht auf ein Wörterbuch zählen können, das eine Reihenfolge hält, die Sie ihm geben möchten, und dass die Reihenfolge implementierungs- und versionsabhängig ist. Für andere einfache Fälle verfügt das Modul collections über eine Unterklasse OrderedDict, die die Reihenfolge der Anzeigen nicht ändert. Aber das wird dir hier nicht wirklich helfen.

+0

Wow, ich fühle mich wie ein Idiot, vielen Dank! – user2101517

+0

Nur das: sortierte (dic.items()) funktionierte für mich, danke. –

0

Hinweis Counter ist eine Unterklasse von dict so das Sortieren, bevor Sie zu Counter hinzufügen:

e.sort() 
dic=Counter(e) 

nicht erreichen, um.

import re 
from collections import Counter 

def print_word_counts(filename): 
    c = Counter() 
    with open(filename) as f: # with block closes file at the end of the block 
     for line in f: # go line by line, don't load it all into mem at once 
      c.update(w.lower() for w in re.findall('[a-zA-Z]+', line)) 

    for k, v in sorted(c.items()): # sorts 
     print k, v 

print_word_counts('engltreaty.txt')