我有一个字典列表:
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 函数来做到这一点?到目前为止,我正在制作一个双循环来获得正确的元素,这并不是最好的。但是,我找不到任何可以与排序功能匹配的内容。
答案 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]
可以避免列表列表。