1

たくさんのメールからデータを読み、各単語の頻度を数えます。最初に2つのカウンターを作成します。

counters.stats = collections.defaultdict(dict)
counters.chi = collections.counter()

統計の鍵は言葉です。単語ごとに、キーは電子メールの名前であり、値はこの電子メール内のその単語の頻度であるdictを作成します。

カイの鍵は統計と同じ言葉です。'stats'のキーを'chi'のキーでソートしたい。この問題は次の方法で修正されます。

def print_stats(counters):
    sorted_key = sorted(counters.stats, key = counters.chi.get)
    result = collections.OrderedDict(k, counters.stats[k] for key in sorted_key)
        for form, cat_to_stats in result.items():
4

1 に答える 1

3

私があなたを正しく理解していれば、これはあなたが望むことをするはずです:

>>> stats = {'a':   {'email1':4, 'email2':3}, 
...          'the': {'email1':2, 'email3':4},
...          'or':  {'email1':2, 'email3':1}}
>>> chi = {'a': 7, 'the':6, 'or':3}
>>> sorted(stats, key=chi.get)
['or', 'the', 'a']

これがあなたのために働くかどうか私に知らせてください。また、Boudが前述したように、numpy/を検討する必要がありますscipy。これにより、パフォーマンスが向上し、多くの組み込み機能が確実に提供されます。

これは機能しないと言っているので(まだ説明していない理由で)、key引数の使用方法のより一般的な例を次に示します。これは、getオブジェクトCounterと標準のdictで機能するだけでなく、何かを実行する関数を作成する方法も示しています。

>>> stats = {'a':   {'email1':4, 'email2':3}, 
...          'the': {'email1':2, 'email3':4},
...          'or':  {'email1':2, 'email3':1}}
>>> wordlists = ([k] * sum(d.itervalues()) for k, d in stats.iteritems())
>>> chi = collections.Counter(word for seq in wordlists for word in seq)
>>> sorted(stats, key=chi.get)
['or', 'the', 'a']
>>> sorted(stats, key=lambda x: chi[x] + 3)
['or', 'the', 'a']
>>> sorted(stats, key=chi.get, reverse=True)
['a', 'the', 'or']

私はまだあなたが探しているものを完全には理解していませんが、おそらくあなたはキーと値のタプルのソートされたリストを取得することを意味しますか?

>>> sorted(stats.iteritems(), key=lambda x: chi[x[0]])
[('or', {'email3': 1, 'email1': 2}), 
 ('the', {'email3': 4, 'email1': 2}), 
 ('a', {'email2': 3, 'email1': 4})]

ただし、実際にはこれを分割することをお勧めします。

>>>> sorted_keys = sorted(stats, key=chi.get)
>>>> [(k, stats[k]) for k in sorted_keys]
[('or', {'email3': 1, 'email1': 2}), ('the', {'email3': 4, 'email1': 2}), ('a', {'email2': 3, 'email1': 4})]

の値でソートされたものが必要だとおっしゃいましたchiが、「統計と同じ構造」です。辞書には順序がないため、これは不可能です。最も近いのは、タプルのソートされたリスト、またはOrderedDict(2.7以降)です。

>>>> collections.OrderedDict((k, stats[k]) for k in sorted_keys)
OrderedDict([('or', {'email3': 1, 'email1': 2}), ('the', {'email3': 4, 'email1': 2}), ('a', {'email2': 3, 'email1': 4})])

辞書を頻繁に並べ替える必要がある場合、この方法は無意味です。

于 2012-05-05T16:20:01.953 に答える