web-dev-qa-db-ja.com

辞書の出力をアルファベット順に戻します

次のコードは、Wordをtxtファイルに出力し、そのWordのインスタンスがいくつあるか(例: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')
17
user2101517

アイテムを並べ替えるだけです。組み込みのsortedは見事に機能するはずです。

_for key,value in sorted(dic.items()):
    ...
_

e.sort()行をドロップすると、これはほぼ同じ時間で実行されます。これが機能しない理由は、ディクショナリがハッシュ値の順序でアイテムを格納するhashテーブルに基づいているためです(ハッシュの衝突が発生した場合は、より複雑な要素が含まれます)。ハッシュ関数はどこにも指定されていないため、辞書を使用して順序を維持することはできず、順序は実装とバージョンに依存します。他の単純なケースでは、collectionsモジュールには挿入順序を維持するOrderedDictサブクラスがあります。ただし、これは実際には役立ちません。

37
mgilson

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