2016-04-04 3 views
1

次のように私はいくつかのIDを持っている:キーを持つ別のリストに基づいてディクショナリのリストを注文するにはどうすればよいですか?

req_ids=['964','123','534','645','876','222'] 

を、私はこのように別のサーバからの応答を取得し、特定の順序ではない:

res_result = [{'id':'123', 'name':'Sachin'}, 
       {'id':'534', 'name':'Vipin'}, 
       {'id':'222', 'name':'Ram'}, 
       {'id':'645', 'name':'Anoop'}, 
       {'id':'964', 'name':'Sani'}, 
       {'id':'876', 'name':'John'}] 

私は同じ要求順序でres_resultを取得する必要がありますこのロジックを実行するために私たち自身のループを書く代わりに、作り付けのPythonの関数を使用して、可能な場合req_ids、

[{'id':'964', 'name':'Sani'}, 
    {'id':'123', 'name':'Sachin'}, 
    {'id':'534', 'name':'Vipin'}, 
    {'id':'645', 'name':'Anoop'}, 
    {'id':'876', 'name':'John'}, 
    {'id':'222', 'name':'Ram'}] 

は、どのように私はこれを行うのですか?その後、

答えて

5

あなた必見並べ替えた場合、整数にキーをマッピング、ソートするそのマップを使用します。

id_to_pos = {key: i for i, key in enumerate(req_ids)} 
sorted(res_result, key=lambda d: id_to_pos[d['id']]) 

デモ:

>>> from pprint import pprint 
>>> req_ids = ['964', '123', '534', '645', '876', '222'] 
>>> res_result = [{'id':'123', 'name':'Sachin'}, 
...    {'id':'534', 'name':'Vipin'}, 
...    {'id':'222', 'name':'Ram'}, 
...    {'id':'645', 'name':'Anoop'}, 
...    {'id':'964', 'name':'Sani'}, 
...    {'id':'876', 'name':'John'}] 
>>> id_to_pos = {key: i for i, key in enumerate(req_ids)} 
>>> sorted(res_result, key=lambda d: id_to_pos[d['id']]) 
[{'id': '964', 'name': 'Sani'}, {'id': '123', 'name': 'Sachin'}, {'id': '534', 'name': 'Vipin'}, {'id': '645', 'name': 'Anoop'}, {'id': '876', 'name': 'John'}, {'id': '222', 'name': 'Ram'}] 
>>> pprint(_) 
[{'id': '964', 'name': 'Sani'}, 
{'id': '123', 'name': 'Sachin'}, 
{'id': '534', 'name': 'Vipin'}, 
{'id': '645', 'name': 'Anoop'}, 
{'id': '876', 'name': 'John'}, 
{'id': '222', 'name': 'Ram'}] 

しかし、あなたは、完全に並べ替えあなたを避けることができすでにが正しい順序を持っている場合は、idのキーを辞書(O(N))にマップするだけで、正しい順序で辞書を引き出すことができます(まだO(N)):

id_to_dict = {d['id']: d for d in res_result} 
[id_to_dict[id] for id in req_ids] 

デモ:

>>> id_to_dict = {d['id']: d for d in res_result} 
>>> [id_to_dict[id] for id in req_ids] 
[{'id': '964', 'name': 'Sani'}, {'id': '123', 'name': 'Sachin'}, {'id': '534', 'name': 'Vipin'}, {'id': '645', 'name': 'Anoop'}, {'id': '876', 'name': 'John'}, {'id': '222', 'name': 'Ram'}] 
>>> pprint(_) 
[{'id': '964', 'name': 'Sani'}, 
{'id': '123', 'name': 'Sachin'}, 
{'id': '534', 'name': 'Vipin'}, 
{'id': '645', 'name': 'Anoop'}, 
{'id': '876', 'name': 'John'}, 
{'id': '222', 'name': 'Ram'}] 
+0

それ複雑O(N^2)? – FazalSap

+1

@FazalSap:いいえ、O(NlogN)、単純にストレートソート。 'id_to_pos'マップは、ソートされた項目ごとにソートキーとO(1)操作を検索します。マップはO(N)時間、*ソートの前に作成されます。したがって、全体的なアルゴリズムは依然としてO(NlogN)ソーティング時間によって支配されている。 –

+1

@FazalSap:でも、あなたは私が適切に思うようになったので、代わりにO(N)のソリューションを追加しました。あなたがすでに固定注文を持っているときにソートする必要はありません。必要なのは、idから辞書へのマップを生成することだけです。 –

2
>>> map({d['id']: d for d in res_result}.__getitem__, req_ids) 
[{'id': '964', 'name': 'Sani'}, {'id': '123', 'name': 'Sachin'}, {'id': '534', 'name': 'Vipin'}, {'id': '645', 'name': 'Anoop'}, {'id': '876', 'name': 'John'}, {'id': '222', 'name': 'Ram'}] 
関連する問題