2017-07-12 4 views
-1

の値の順序で私は次のように並べ替えしたいカウンタいる:どのようにソートカウンタアルファベット順THENのPython

Counter({'M': 9, 'L': 5, 'P': 5, 'S': 2, 'd': 1, 'T': 1}) 

私は自分のコードを使用し、ここでそれは私を与えるものです:

Counter({'M': 9, 'P': 5, 'L': 5, 'S': 2, 'T': 1, 'd': 1}) 

I)は、ソート機能を(試してみましたが、私はそれを使用する場合、その戻り値はもうカウンターではありません。

ここは私のコードですが、どうしたらいいですか?

def most_encountered_letters(dictionnary): 
    counter = collections.Counter() 
    for line in dictionnary: 
     words = line.split(',')[0].split(' ') 
     for word in words: 
      counter[word[0]] += 1 

    print(counter)                           
    return counter.most_common(5) 
+1

'Counter'は' Dict'サブクラスなので定義上はソートされていないので、 'sorted()'を使うと 'Dict'以外のクラスを返す必要があります。結果を['OrderedDict'](https://stackoverflow.com/a/9001529/1270789)に移すことができます。私は思いますが、私の質問は「あなたはなぜソートしたいのですか?」というものです。あなたの実際の問題が別の方法でよりよく対処されるかもしれないからです。最後に、ソートする方法がたくさんあります(https://wiki.python.org/moin/HowTo/Sorting)。 BTW、Python 2.xまたは3.x? –

+0

Pythonで 'Dict'をソートする方法はありません。唯一の方法はリンクを調べることですhttps://stackoverflow.com/questions/613183/sort-a-python-dictionary-by-value?page=1&tab=投票#tab-top – Wen

+0

_正確に!あなたの答えではなく、あなたの質問を大幅に変更し、両方の回答を無効にしました。 –

答えて

2

Counterは順不同です。それらはdictのサブクラスであり、dictのように発注されていません。 「ソートされたCounter」と言っても意味がありません。

>>> from collections import Counter 
>>> c = Counter({'M': 9, 'L': 5, 'P': 5, 'S': 2, 'd': 1, 'T': 1}) 
>>> c 
Counter({'M': 9, 'L': 5, 'P': 5, 'S': 2, 'T': 1, 'd': 1}) 
>>> sorted(c.items(), key= lambda t: (t[1], t[0]), reverse=True) 
[('M', 9), ('P', 5), ('L', 5), ('S', 2), ('d', 1), ('T', 1)] 

ご注文Mappingタイプをしたい場合は、内蔵のOrderedDictを使用する必要があり、または、独自の実装のどちらか:あなたは例えば、あなたが望むようにソートCounter内の項目のリストを取得することができます。複数の継承を使用して組み込みクラスを再利用して、必要なものを得ることができます。このレシピstraight from the docsです:

class OrderedCounter(Counter, OrderedDict): 
    'Counter that remembers the order elements are first encountered' 

    def __repr__(self): 
     return '%s(%r)' % (self.__class__.__name__, OrderedDict(self)) 

    def __reduce__(self): 
     return self.__class__, (OrderedDict(self),) 

ので、アクションで:あなたが注文したCounterを必要とする理由

>>> oc = OrderedCounter() 
>>> for k,v in sorted(c.items(), key= lambda t: (t[1], t[0]), reverse=True): 
...  oc[k] = v 
... 
>>> oc 
OrderedCounter(OrderedDict([('M', 9), ('P', 5), ('L', 5), ('S', 2), ('d', 1), ('T', 1)])) 
>>> for k,v in oc.items(): 
... print(k,v) 
... 
M 9 
P 5 
L 5 
S 2 
d 1 
T 1 
>>> 
さらに重要な

、あなたがを考慮する必要があります...あなた本当には1が必要なのでしょうか?