2016-04-04 7 views
1

Ich habe einige ids wie folgt:Wie kann ich eine Liste von Wörterbüchern basierend auf einer anderen Liste bestellen, die den Schlüssel hat?

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

und ich bekomme eine Antwort von einem anderen Server wie diese nicht in einer bestimmten Reihenfolge:

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'}] 

Ich brauche res_result in der gleichen Anfrage zu erhalten, um als 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'}] 

Wie kann ich tun dies, wenn möglich, eine eingebaute python-Funktion statt schreiben unsere eigene Schleife mit dieser Logik zu tun?

Antwort

5

Wenn Sie müssen sortieren, die Schlüssel auf ganze Zahlen abzubilden, dann diese Karte verwenden zu sortieren:

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

Demo:

>>> 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'}] 

Sie können jedoch ganz vermeiden sortieren, Sie bereits haben die richtige Reihenfolge, müssen Sie nur von id Schlüssel zu Wörterbüchern zuordnen (O (N)), dann ziehen Sie die Wörterbücher in der richtigen Reihenfolge (noch O (N)):

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

Demo:

>>> 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

er die Komplexität O (n^2)? – FazalSap

+1

@FazalSap: nein, O (NlogN), einfach gerade Sortierung; Die 'id_to_pos'-Map macht das Durchsuchen des Sortierschlüssels um eine O (1) -Operation pro sortiertem Element. Die Karte wird in O (N) Zeit, * vor * der Sortierung erstellt. Der Gesamtalgorithmus wird also immer noch von der Sortierzeit O (NlogN) dominiert. –

+1

@FazalSap: aber jetzt, wo Sie mich richtig denken ließen, fügte ich stattdessen eine O (N) -Lösung hinzu. Sie müssen nicht sortieren, wenn Sie bereits eine feste Bestellung haben. Sie müssen lediglich eine Karte von der ID zum Wörterbuch erstellen. –

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'}] 
Verwandte Themen