Вернуть вывод словаря в алфавитном порядке

Следующий код распечатывает слово в текстовом файле, а затем, сколько экземпляров этого слова (например, 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')

2 ответа

Решение

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

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

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

Заметка 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')
Другие вопросы по тегам