根据另一个列表对 Python 中的字典列表进行排序

时间:2021-03-17 16:07:57

标签: python list sorting dictionary

我有一个字典列表:

a = [{"id": 5, "data": "data1"}, {"id": 2, "data": "data2"}, {"id": 10, "data": "data3"}, {"id": 121, "data": "data4"}]

和 ID 列表:

ids_order = [10, 2, 5, 121]

我想对我的字典列表 a 重新排序,以便我的新列表 new_a 的字典的值位于列表 ids_order 之后的键“id”:

new_a = [{"id": 10, "data": "data3"}, {"id": 2, "data": "data2"}, {"id": 5, "data": "data1"}, {"id": 121, "data": "data4"}]

有没有一种有效的方法可以使用 sort 函数来做到这一点?到目前为止,我正在制作一个双循环来获得正确的元素,这并不是最好的。但是,我找不到任何可以与排序功能匹配的内容。

3 个答案:

答案 0 :(得分:2)

您可以将 id 的 temp 临时映射到字典,稍后可用于根据给定的顺序进行选择。

temp = {d["id"]: d for d in a}
new_a = [temp[i] for i in ids_order]
print(new_a)

输出:

[{'id': 10, 'data': 'data3'}, {'id': 2, 'data': 'data2'}, {'id': 5, 'data': 'data1'}, {'id': 121, 'data': 'data4'}]

答案 1 :(得分:0)

ids_order = [10, 2, 5, 121]    
int_order = [a[i]['id'] for i in range(4)]
ind_change = [int_order.index(ids_order[i]) for i in range(4)]

new_a = [a[i] for i in ind_change]
print(new_a)

答案 2 :(得分:0)

我通过制作一个嵌套的理解列表解决了这个问题。它有效,但我不知道它是否可以扩展到大列表。

new_a = [[feat for feat in a if feat["id"] == i][0] for i in ids_order]

注意:使用 [0] 可以避免列表列表。