web-dev-qa-db-ja.com

Python Counter keys()の戻り値

発生回数順に並べられたカウンターがあります。

_counterlist = Counter({'they': 203, 'would': 138, 'your': 134,...}).
_

しかし、私がcounterlist.keys()を実行すると、戻りリストは次のようになります。

_['wirespe', 'four', 'accus',...]
_

の代わりに

_['they', 'would', 'your',...].
_

どうして?

8
user3005486

Counter()

Counterは、ハッシュ可能なオブジェクトをカウントするためのdictサブクラスです。これは、要素が辞書キーとして格納され、それらの数が辞書値として格納される、順序付けされていないコレクションです。

順不同の辞書なので、それらを辞書に追加した順序は保持されません。それらを順番に保持したい場合は OrderedDict() を使用する必要があります

OrderedCounter()が必要な場合は、これを行うことができます。これは here から取得しています。これには、なぜ機能するかについての説明があります。

from collections import *

class OrderedCounter(Counter, OrderedDict):
    pass

counterlist = OrderedCounter({'would': 203, 'they': 138, 'your': 134})

print counterlist.keys()
12
SirParselot

辞書に特定の順序で値を入力している間、dictはどのような順序も保持しません。辞書の.keys()は、特定の順序で戻りません。順序を保持するOrderedDictがありますが、それがCounterとどのように相互作用するかはわかりません。

編集:

Counter.most_common() を使用することもできます。これは、willであるタプルのリストを返します。

2
Tim Tisdall

追加のクラスを作成しない別のソリューションは、所有しているアイテムのセットを取得し、カウントされたキーに基づいてそれらをソートすることです。以下のコードは@ user3005486に基づいています:

import collections

#if this is your list    
list_to_be_sorted = ['they', 'would', 'they', ...]
#then counterlist = {'would': 203, 'they': 138, 'your': 134}
counterlist = collections.Counter(list_to_be_sorted)
#if you sort this list ascendingly you get ['would', 'would', ..., 'they', 'they', ...etc.]
sorted_words = sorted(counterlist, key: lambda x:-counterlist[x])
distinct_words_from_list = set(list_to_be_sorted)
sorted_distinct_list = sorted(distinct_words_from_list, key: lambda x:-counterlist[x])
#then sorted_distinct_list = ['would', 'they', 'your']
1
Bahaa