2013-05-17 22 views
12

Poniższy kod wypisuje słowo w pliku txt, a następnie liczbę wystąpień tego słowa (np. A, 26) problem polega na tym, że nie jest on drukowany w alfabetycznym alfabecie zamówienie. Każda pomoc będzie bardzo doceniana:zwraca dane wyjściowe słownika do porządku alfabetycznego

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') 

Odpowiedz

28

Wystarczy posortować przedmioty. Polecenie wbudowane sorted powinien działać wspaniale:

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

Jeśli spadek linii e.sort(), to powinien działać w przybliżeniu taką samą ilość czasu. Powodem, dla którego nie działa, jest to, że słowniki są oparte na tabelach hash, które przechowują elementy według ich wartości skrótu (z bardziej skomplikowanymi elementami, gdy występują kolizje haszowania). Ponieważ funkcja skrótu nigdy nie jest określona nigdzie, oznacza to, że nie można liczyć na słownik zachowujący dowolną kolejność, którą próbujesz podać i że zamówienie jest zależne od implementacji i wersji. W innych prostych przypadkach moduł collections ma podklasę OrderedDict, która zachowuje kolejność wstawiania. jednak to ci naprawdę nie pomoże.

+0

Wow Czuję się jak idiota, dziękuję bardzo! – user2101517

+0

Po prostu: posortowane (dic.items()) pracował dla mnie, dzięki. –

0

Uwaga Counter jest podklasą dict tak sortowania przed dodaniem do Counter:

e.sort() 
dic=Counter(e) 

nie osiągnie zamówienia.

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')