Возвращает выход словаря в алфавитном порядке

Следующий код печатает слово в файле txt, а затем сколько экземпляров этого слова (например, a, 26) проблема в том, что он не распечатывает его в алфавитном порядке. Любая помощь будет высоко оценена

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

Ответ 1

Вам просто нужно отсортировать элементы. Встроенный sorted должен отлично работать:

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

Если вы отбрасываете строку e.sort(), то это должно выполняться примерно столько же времени. Причина, по которой он не работает, заключается в том, что словари основаны на таблицах hash, которые хранят элементы в порядке их хеш-значений (с некоторыми более сложными вещами при возникновении столкновений хэшей). Поскольку хеширующая функция никогда нигде не указана, это означает, что вы не можете рассчитывать на словарь, поддерживающий любой порядок, который вы пытаетесь ему дать, и что заказ выполняется и зависит от версии. Для других простых случаев модуль collections имеет подкласс OrderedDict, который сохраняет порядок вставки. однако, это не поможет вам здесь.

Ответ 2

Примечание Counter является подклассом dict, поэтому сортировка перед добавлением в Counter:

e.sort()
dic=Counter(e)

не достигнет порядка.

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