2013-04-08 13 views
7

Załóżmy, że mam tych list:Sortowanie jednej listy pasujące do drugiego w Pythonie

ids = [4, 3, 7, 8] 
objects = [ 
      {"id": 7, "text": "are"}, 
      {"id": 3, "text": "how"}, 
      {"id": 8, "text": "you"}, 
      {"id": 4, "text": "hello"} 
      ] 

Jak mogę posortować objects więc kolejność ich identyfikatory mecze ids? To znaczy. aby uzyskać ten wynik:

objects = [ 
      {"id": 4, "text": "hello"}, 
      {"id": 3, "text": "how"}, 
      {"id": 7, "text": "are"}, 
      {"id": 8, "text": "you"} 
      ] 

Odpowiedz

8
object_map = {o['id']: o for o in objects} 
objects = [object_map[id] for id in ids] 
+0

myślę, że czynnik dict-Comp się tak nie robisz go w kółko. – mgilson

1
In [25]: idmap = dict((id,pos) for pos,id in enumerate(ids)) 

In [26]: sorted(objects, key=lambda x:idmap[x['id']]) 
Out[26]: 
[{'id': 4, 'text': 'hello'}, 
{'id': 3, 'text': 'how'}, 
{'id': 7, 'text': 'are'}, 
{'id': 8, 'text': 'you'}] 
+0

Dziwnie prawie char za char, co miałem w moim edytorze tekstu;) –

+0

@JonClements: Wyraźnie spędzamy zbyt dużo czasu na tej stronie;) – NPE

0
>>> ids = [4,3,7,8] 
>>> id_orders = {} 
>>> for i,id in enumerate(ids): 
...  id_orders[id] = i 
... 
>>> id_orders 
{8: 3, 3: 1, 4: 0, 7: 2} 
>>> 
>>> sorted(objs, key=lambda x: id_orders[x['id']]) 
+0

To nie różni się znacząco od odpowiedzi NPE ... –

Powiązane problemy