Python,按任意顺序对dicts列表进行排序

时间:2012-05-09 17:42:28

标签: python

  

可能重复:
  Sorting list of lists by a third list of specified non-sorted order

a = [{'id':1}, {'id':2}, {'id':3}]
b = [2,1,3]

通过dict属性按list b排序id a是一个好方法。

结果看起来应该是这样的

[{'id':2}, {'id':1}, {'id':3}]

3 个答案:

答案 0 :(得分:7)

只要您可以保证b填充了id中的所有a,就不需要伏都教:

In [1]: a = [{'id':1}, {'id':2}, {'id':3}]

In [2]: b = [2,1,3]

In [3]: a.sort(key=lambda v : b.index(v['id']))

In [4]: a
Out[4]: [{'id': 2}, {'id': 1}, {'id': 3}]

(我经常被告知现在应该使用lambda的替代方案,但这仍然是我所知道的最明智的方式)

编辑:另请注意,这与链接问题中的this answer几乎相同。

答案 1 :(得分:3)

dictFromList = dict(zip((x['id'] for x in a), a))
sortedList = [dictFromList[i] for i in b] 

答案 2 :(得分:1)

Python 2.7:

def sort_dict_by_list(a, b):        
    sortkeys = { v: k for (k, v) in enumerate(b) }
    return list(sorted(a, key=lambda x: sortkeys[x['id']]))

a = [{ 'id': 1, 'name': 'foo' }, { 'id': 2, 'name': 'bar' }, { 'id': 3, 'name': 'baz' }]
b = [2,1,3]
print sort_dict_by_list(a, b)

打印:

[{'id': 2, 'name': 'bar'}, {'id': 1, 'name': 'foo'}, {'id': 3, 'name': 'baz'}]