2016-08-08 3 views
1

要素の頻度別にリストをソートするこのコードがあります。 2つの要素の頻度が同じ場合を除いて、他のすべてのケースで機能します。周波数が同じであれば、私は、より高い値の前に最初に小さい値を配置する:[3,1,2,2,4]の場合要素の頻度別にPythonリストをソート

counts = collections.Counter(arr) 
new_list = sorted(arr, key=lambda x: counts[x]) 

for item in new_list: 
    print item 

出力は[1,3,4,2,2]する必要がありますが、私は[3,1,4,2,2]を取得します。このエラーを解決するにはどうすればよいですか?

答えて

2

キーラムダ関数をタプルに設定することができます。したがって、最初にcounts[x]でソートされ、ネクタイがある場合は値xでソートされます。

new_list = sorted(arr, key=lambda x: (counts[x], x)) 
+0

'[4,3,1,2,2]は'それは最初の小さな数でなければならない場合、私は思う間違った出力 – user2916886

+5

それはする必要があります ' new_list = sorted(arr、key = lambda x:(counts [x]、x)) '? – Karin

+1

@カリンよ、すみません。それを私が直した。 – levi

1

あなたはアイテムの数でソートされています。このロジックでは、一度表示されるすべてのアイテムは同じ「重み」を持つため、Pythonは元の関連する位置を保持します。たとえば、31は両方とも一度表示されるため、並べ替えに関する限り同等です。 3は元のリストの1の前に来るため、結果の先頭にも配置されます。

必要な出力には、第2ソート基準(要素の値)が必要です。そのためには、あなたがこれを明示的に指定する必要があります。これは作る

new_list = sorted(arr, key=lambda x: (counts[x], x)) 
関連する問題