辞書としてヒストグラムが与えられた場合、その辞書で定義された頻度によって、辞書の要素のみを持つリストをソートする最もpythonicな「バッテリーを含む」方法は何ですか?
ディクショナリのキー (および暗黙的にリスト内の値) は文字列であり、頻度は整数として格納されます。
私は python2 ソリューションにのみ興味がありますが、Python ソリューションも同様に作成して、他の人も (将来的に) 恩恵を受けることができます。
辞書としてヒストグラムが与えられた場合、その辞書で定義された頻度によって、辞書の要素のみを持つリストをソートする最もpythonicな「バッテリーを含む」方法は何ですか?
ディクショナリのキー (および暗黙的にリスト内の値) は文字列であり、頻度は整数として格納されます。
私は python2 ソリューションにのみ興味がありますが、Python ソリューションも同様に作成して、他の人も (将来的に) 恩恵を受けることができます。
>>> inList = [1,2,3,4,5]
>>> inDict = {1:5, 2:2, 3:4, 4:1, 5:3}
>>> sorted(inList, key=lambda x: inDict.get(x,0))
[4, 2, 5, 3, 1]
これには、単に KeyError を発生させるのではなく、値が 0 の辞書にあるかのように、辞書にない要素を並べ替えるという利点もあります。
このsorted()
関数には、オプションの引数 'key' があります。この引数は、各リスト要素から比較キーを抽出するために使用される 1 つの引数の関数を指定します。この比較キーは、要素間の順序を決定するために使用されます。
ヒストグラムを生成するには、通常、メソッドcollections.Counter
が組み込まれている を使用します。.most_common()
カウンターのような辞書を Counter に渡すと、想像どおりに機能します。
>>> test_dict = {1: 6, 2: 8, 3: 2, 4: 4, 5: 8, 6: 4, 7: 10, 8: 3, 9: 7}
>>> c = Counter(test_dict)
# returns a list of tuples with the (item, count) values.
>>> c.most_common()
[(7, 10), (2, 8), (5, 8), (9, 7), (1, 6), (4, 4), (6, 4), (8, 3), (3, 2)]
# if you want only the counts:
>>> [count for item, count in c.most_common()]
[10, 8, 8, 7, 6, 4, 4, 3, 2]
# if you want only the objects:
>>> [item for item, count in c.most_common()]
[7, 2, 5, 9, 1, 4, 6, 8, 3]
# if you want them in reverse order
>>> [item for item, count in c.most_common()][::-1]
[3, 8, 6, 4, 1, 9, 5, 2, 7]
リストベースの入力から元のカウントのサブセットのカウンター オブジェクトを作成するのは簡単です。次のいずれかの関数を使用できます。
def return_count_from_list(oldcount, my_list):
count = Counter()
for i in my_list:
count[i] = oldcount[i]
return count
または、結果のみが必要な場合は、次のようにリストを含めることができます。
my_list = [1, 4, 5]
>>> [count for item, count in c.most_common() if item in my_list]
[8, 6, 4]