19

下面的代码打印出 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')
4

2 回答 2

42

您只需要对项目进行排序。内置sorted应该很好地工作:

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

如果你放弃这e.sort()条线,那么这应该在大约相同的时间内运行。它不起作用的原因是因为字典基于按hash哈希值顺序存储项目的表(发生哈希冲突时会出现一些更复杂的东西)。由于散列函数从未在任何地方指定,这意味着您不能指望字典保持您尝试给它的任何顺序,并且该顺序取决于实现和版本。对于其他简单的情况,collections模块有一个OrderedDict保持插入顺序的子类。但是,这对您没有帮助。

于 2013-05-17T01:45:03.160 回答
0

注意Counterdict在添加到之前进行排序的子类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')
于 2013-05-17T01:50:04.743 回答