2013-04-08 82 views
7

假設我有這些列表:排序一個列表,以匹配另一個在python

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

我如何排序的objects所以它們的ID的順序相匹配ids?即要得到這樣的結果:

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

回答

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

我想我會的因素字典-COMP,所以你不是在一遍又一遍的做。 – mgilson 2013-04-08 13:56:07

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

奇怪的是,我在文本編輯器中使用的char字符很多;) – 2013-04-08 13:58:25

+0

@JonClements:我們顯然在這個網站上花費太多時間;) – NPE 2013-04-08 13:58:56

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

這與NPE的答案沒有太大區別... – 2013-04-08 14:00:31

相關問題