在Python中将一个列表排序以匹配另一个列表

9
假设我有以下列表:
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"}
          ]

1
请注意,以下答案假设“id”是对象之间的某个唯一属性。 - zr0gravity7
4个回答

11
object_map = {o['id']: o for o in objects}
objects = [object_map[id] for id in ids]

我认为我会将字典推导式分解出来,这样你就不需要一遍又一遍地重复它。 - mgilson

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

有趣的是,几乎一模一样,就像我在文本编辑器中写的一样 ;) - Jon Clements
@JonClements:我们显然在这个网站上花费了太多的时间 ;) - 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

使用带有自定义 key 函数的 sorted,该函数仅从 ids 中获取 index

sorted(objects, key=lambda x: ids.index(x['id']))

(灵感来自NPE的答案。)


啊,是的,这是一个更好的答案。 - Timmmm
实际上我撤回了之前的说法,这个.index()会导致子优化复杂度。 - Timmmm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接