2016-07-05 1 views
1

の場合にはアルファベット順に維持しながら値で辞書を並べ替え、私は値で辞書をソートした項目の値が同じである場合にネクタイの場合にはアルファベット順に維持する必要があります。しかし、Python辞書はアルファベット順にデータを保存しません。どのように修正するのですか?前もって感謝します!ここで パイソン:だから絆

は私のコードです:

from collections import Counter 
test = "betty bought a bit of butter but the butter was bitter" 
Counter(test.split()).most_common(3) 

出力:

[('butter', 2), ('a', 1), ('bitter', 1)] 

所望の出力は次のようになります。その背後にあるべき '苦い' 'ベティ以来

[('butter', 2), ('a', 1), ('betty', 1)] 

アルファベット順。

答えて

3

その部分のソートを反転する数、アルファベット順に返されるキー自体に渡して、カスタムキーとheapq.nsmallest() functionを使用します。Counter.most_common()方法はheapq.nlargest()を使用しています

import heapq 

top3 = heapq.nsmallest(
    3, Counter(test.split()).items(), 
    key=lambda kv: (-kv[1], kv[0])) 

あなたが辞書にあるキーの数よりも小さい引数を与え、順序を決定するためにカウントを使用するだけなので、結びつきの場合、順序は任意です。上記はあなたの特定のソート順に相当します。 Counter.most_common()のように、これはO(NlogK)ソリューションです(Nはカウントされるアイテムの数、Kは出力するアイテムの数)。

デモ:また

>>> import heapq 
>>> from collections import Counter 
>>> test = "betty bought a bit of butter but the butter was bitter" 
>>> heapq.nsmallest(3, Counter(test.split()).items(), key=lambda kv: (-kv[1], kv[0])) 
[('butter', 2), ('a', 1), ('betty', 1)] 
1

- あなたはミックスできCounterOrderedDict

from collections import Counter, OrderedDict 

class OrderedCounter(Counter, OrderedDict): 
    pass 

test = "betty bought a bit of butter but the butter was bitter" 
mc = OrderedCounter(sorted(test.split())).most_common(3) 
# [('butter', 2), ('a', 1), ('betty', 1)] 
+0

これは完全なOが必要です(NlogN)の並べ替え、** Oに加え**中(NlogK) heapqは 'most_common'を呼び出します。 –

+0

@MartijnPieters私は確かに効率についての主張をしていません - それは他の状況で役に立つかもしれない単なる代替アプローチです... –