2016-08-11 21 views
0

最近Pythonでプログラミングを開始しましたが、私は答えが出てこない質問があります。私はさまざまなキーと値を持つ辞書類型のリストを持っています(以下を参照)。リストに表示される辞書の順序を並べ替える必要があります。 list_one辞書のリストを2つの基準で並べ替え

list_one = [{'country': 'Spain',  'id': 'v1', 'key2': 'value2'}, 
      {'country': 'France', 'id': 'v4', 'key2': 'value2'}, 
      {'country': 'China',  'id': 'v4', 'key2': 'value2'}, 
      {'country': 'Russia', 'id': 'v3', 'key2': 'value2'}, 
      {'country': 'Australia', 'id': 'v2', 'key2': 'value2'}, 
      {'country': 'China',  'id': 'v3', 'key2': 'value2'}, 
      ... 
      ] 

まず、ソートの 'ID' の値(v1v2v3、...)(私は罰金うまくできています)。

さらに、idの値が同じ場合は、'country'キーの値に従って並べ替えます。私はこれらをアルファベット順にソートしたくありません。私はこれらの国に設定された値に基づいてソートできるようにしたいと思います。したがって、例えば、France = 1,China = 2,Australia = 3,Spain = 4,Russia = 5のようになります。

辞書の順序は、2番目の の例のようになります。 list_two

[{'country': 'Spain',  'id': 'v1', 'key2': 'value2'}, 
{'country': 'Australia', 'id': 'v2', 'key2': 'value2'}, 
{'country': 'China',  'id': 'v3', 'key2': 'value2'}, 
{'country': 'Russia', 'id': 'v3', 'key2': 'value2'}, 
{'country': 'France', 'id': 'v4', 'key2': 'value2'}, 
{'country': 'China',  'id': 'v4', 'key2': 'value2'} 
... 
] 

それらdictsは以下のようにして、いくつかの「暗黙の値」セットにし、最初の「ID」キーの値に、リストに表示される順序をソートするニシキヘビの方法があります国は?

list_two = sorted(list_one, key=lambda k: k['id']) 

答えて

3

は番号を注文する辞書マッピング国の名前を生成します。その後、

country_ordering = {'France': 1, 'China': 2, 'Australia': 3, 
        'Spain': 4, 'Russia': 5} 

idでタプルを返す、あなたのソートキーにそれを使用し、そのマッピングから値:

list_two = sorted(
    list_one, 
    key=lambda k: (k['id'], country_ordering.get(k['country'], float('inf'))) 

dict.get()メソッドを使用して注文値を検索しました。その方法では、国がまだマッピングにリストされていない場合にデフォルト値を指定することができます。上記の私はfloat('inf')無限)をデフォルト値として使用しました。つまり、そのようなリストにない国はすべて、最後にソートされます(指定されたid)。

あなたは例外ではなく、スローされるようにしたい場合は、にラムダを変更:ストレートキーのルックアップを行うために

lambda k: (k['id'], country_ordering[k['country']]) 

デモ:

>>> list_one = [{'country': 'Spain',  'id': 'v1', 'key2': 'value2'}, 
...    {'country': 'France', 'id': 'v4', 'key2': 'value2'}, 
...    {'country': 'China',  'id': 'v4', 'key2': 'value2'}, 
...    {'country': 'Russia', 'id': 'v3', 'key2': 'value2'}, 
...    {'country': 'Australia', 'id': 'v2', 'key2': 'value2'}, 
...    {'country': 'China',  'id': 'v3', 'key2': 'value2'}] 
>>> country_ordering = {'France': 1, 'China': 2, 'Australia': 3, 'Spain': 4, 'Russia': 5} 
>>> sorted(list_one, key=lambda k: (k['id'], country_ordering[k['country']])) 
[{'country': 'Spain', 'id': 'v1', 'key2': 'value2'}, {'country': 'Australia', 'id': 'v2', 'key2': 'value2'}, {'country': 'China', 'id': 'v3', 'key2': 'value2'}, {'country': 'Russia', 'id': 'v3', 'key2': 'value2'}, {'country': 'France', 'id': 'v4', 'key2': 'value2'}, {'country': 'China', 'id': 'v4', 'key2': 'value2'}] 
>>> pprint(_) 
[{'country': 'Spain', 'id': 'v1', 'key2': 'value2'}, 
{'country': 'Australia', 'id': 'v2', 'key2': 'value2'}, 
{'country': 'China', 'id': 'v3', 'key2': 'value2'}, 
{'country': 'Russia', 'id': 'v3', 'key2': 'value2'}, 
{'country': 'France', 'id': 'v4', 'key2': 'value2'}, 
{'country': 'China', 'id': 'v4', 'key2': 'value2'}] 
+0

おかげで、それは素晴らしい作品!しかし1つの余分な質問。 'ids'の注文がすでに正しく行われていて、同じ「国」でそれらの辞書を並べ替えるだけの場合はどうなりますか? – PDavis

+0

@PDavis:フルキーでソートする必要があります。その場合、再ソートについて心配する必要はありません。ソートアルゴリズムPythonは([* Timsort *](https://en.wikipedia.org/wiki/Timsort))ソート済みのサブセクションを利用します。 –

+0

私は同じ「ids」を持つそれらの言い回しを意味しました。 – PDavis

関連する問題