2017-07-12 16 views
0

以下は、私が持っているサンプル辞書です。どういうわけか、私はこの方程式多次元辞書を値でソートし、Pythonで新しくソートされた辞書を返す

dict_sorted = sorted(my_dict, key=lambda x: int(my_dict[x]['marks']), reverse=True) 
を使用して marksことによってそれをソートし得る必要があり、

my_dict = { 
     '003':{ 
      'class':'13', 
      'marks':'90', 
      'name':'CCC', 
      'date_accessed':'2017-07-12 17:43:24' 
     }, 
     '002':{ 
      'marks':'90', 
      'class':'10', 
      'name':'BBB', 
      'date_accessed':'2017-07-12 17:43:24' 
     }, 
     '001':{ 
      'marks':'80', 
      'class':'9', 
      'name':'AAA', 
      'date_accessed':'2017-07-12 17:43:24' 
     }, 
     '005':{ 
      'date_accessed':'2017-07-12 17:43:42', 
      'marks':'999', 
      'name':'EEE', 
      'class':'99' 
     }, 
     '004':{ 
      'class':'50', 
      'marks':'100', 
      'name':'DDD', 
      'date_accessed':'2017-07-12 17:43:24' 
     } 
    } 

は、今私はmarksことによってそれをソートしたいので、結果として辞書には、今、この

my_dict = { 
     '005':{ 
      'date_accessed':'2017-07-12 17:43:42', 
      'marks':'999', 
      'name':'EEE', 
      'class':'99' 
     }, 
     '004':{ 
      'class':'50', 
      'marks':'100', 
      'name':'DDD', 
      'date_accessed':'2017-07-12 17:43:24' 
     } 
     '003':{ 
      'class':'13', 
      'marks':'90', 
      'name':'CCC', 
      'date_accessed':'2017-07-12 17:43:24' 
     }, 
     '002':{ 
      'marks':'90', 
      'class':'10', 
      'name':'BBB', 
      'date_accessed':'2017-07-12 17:43:24' 
     }, 
     '001':{ 
      'marks':'80', 
      'class':'9', 
      'name':'AAA', 
      'date_accessed':'2017-07-12 17:43:24' 
     }, 
    } 

のようになります

しかし、これは私にはソートされた方法でkeysしか与えませんが、上記のように新しくソートされた辞書を生成することはできません。親切にも私はここで辞書を並べ替えるためにmarksで助け、新しいソートされた辞書を与えます。ありがとう。

編集:私はすでにとこのIssue sorting a multi-dimensional dictionary that has non-numeric indices in Pythonのようなstackoverflowで多くの記事を見てきましたが、これらの投稿は私が必要とする結果を提供できませんでした。

+2

可能な重複:

def sort_dict_to_top_whatever(dict_to_sort, how_many_to_store): """ function will sort the input dict and return the amount of the input number as top :param dict_to_sort: the dict with numbers at the values :param how_many_to_store: how much to take :return: the sorted dict """ # -x: because we need to reverse sort: step1_sort_to_list = sorted(list(dict_to_sort.items()), key = lambda x: -int(x[1]["marks"])) step2_take_top = step1_sort_to_list[:how_many_to_store] step3_the_dict = {info[FIRST]: info[1] for info in step2_take_top} return step3_the_dict 

、その後:あなたは本当に私の知る限りでは、辞書を並べ替えることはできませんまあpythonで – architrex

+0

あなたの目標辞書は入力辞書と同じです(あなたのタイプミスを除く)。 –

+0

辞書は*順不同です。 「ソートされた辞書」と言っても意味がありません。あなたの最善の選択肢は 'collections.OrderedDict'のような順序付けられたマッピングを使うことです。とにかくそれを「ソート」する必要があるのはなぜですか? –

答えて

6

までの数字は、までです。 辞書の少数のリリースのみが発注されます。で記述されているようdocumentation

この新しいインプリメンテーションのため保存局面は 実装の詳細とみなされ、が依拠すべきではない(今後このかもしれ 変更、それはに望まれていますすべての現在 と将来のPythonの実装のため保存セマンティクスを強制する 言語仕様を変更する前に、いくつかのリリースのための言語でのこの新しいdict 実装を持っている。これはまた 言語の古いバージョンで 後方互換性を維持するのに役立ちます走ったdom iteration orderはまだ有効です。 Python 3.5)。

だから私たちはより良い後悔するより安全であるとdictを使用しないでください。

collectionsの要素の順序、それらが追加された方法を維持する辞書であるOrderedDictクラスがあります。

私たちは、このように、今では好きで使用することができます:あなたはキーと値のペアを持つタプルを取得するために.items()を使用する必要が

from collections import OrderedDict 

OrderedDict(sorted(my_dict.items(),key=lambda x:int(x[1]['marks']),reverse=True))

注意。次に、値(タプルの2番目の要素)を取得し、その値から'marks'キーに関連付けられた値を取得して要素をソートします。

数値比較が必要な場合は、最初に整数に変換するためにint(..)コールを追加する必要があります。

これが生成します。

>>> OrderedDict(sorted(my_dict.items(),key=lambda x:int(x[1]['marks']),reverse=True)) 
OrderedDict([('005', {'name': 'EEE', 'date_accessed': '2017-07-12 17:43:42', 'class': '99', 'marks': '999'}), ('004', {'name': 'DDD', 'date_accessed': '2017-07-12 17:43:24', 'class': '50', 'marks': '100'}), ('003', {'name': 'CCC', 'date_accessed': '2017-07-12 17:43:24', 'class': '13', 'marks': '90'}), ('002', {'name': 'BBB', 'date_accessed': '2017-07-12 17:43:24', 'class': '10', 'marks': '90'}), ('001', {'name': 'AAA', 'date_accessed': '2017-07-12 17:43:24', 'class': '9', 'marks': '80'})]) 

OrderedDictはPythonでバニラ辞書のサブクラスです。したがって、dictによってサポートされるすべての操作は、OrderedDictによってもサポートされます。分類A [の

sorted_dict = sort_dict_to_top_whatever(my_dict, len(my_dict)) 
+0

dictのCPython-3.6実装のみが注文されています。その機能はいくつかのリリースで正式なPython機能になります。[here](https://docs.python.org/3.6/whatsnew/3.6.html#new- dict-implementation) – jadsq

+0

@jadsq:コメントありがとうございます。私はこれを答えに加えました。 –

0

は、私は次のコードを使用しますPython辞書による値](https://stackoverflow.com/questions/613183/sort-a-python-dictionary-by-value)
関連する問題