在Python中,如何使用另一个列表来排序字典列表?

2 投票
5 回答
1038 浏览
提问于 2025-04-16 21:28
b = [{'id': 'a'}, {'id': 'c'}, {'id': 'b'}, {'id': 'e'}]

我需要把这个变成:

b = [{'id': 'a'}, {'id': 'c'}, {'id': 'e'}, {'id': 'b'}]

这个新顺序是由另一个列表定义的。

my_filter = ['a', 'c', 'e', 'b']

...正如你所看到的,包含字典的列表现在有了一系列的ID,这些ID是在my_filter变量中给出的。

我可以重新排序这个列表,但需要用很多循环,这样效率不高。你知道有没有更好的方法?我已经知道如何根据字典的值对字典列表进行排序,但我需要这个顺序是由另一个列表来定义的。

编辑my_filter原本叫filter,我在Dave Kirby的建议后改的,因为它是一个内置函数。由于一些回答中仍然使用filter,所以这个编辑部分是为了避免你看到某些回答中有filter时产生混淆。

5 个回答

3
order = dict((v, i) for (i,v) in enumerate(filter))
sorted(b, key=lambda x:order[x['id']])

这个方法应该比Ignacio的答案更有效率,因为查找字典的时间复杂度是O(1),而用index(x)查找的时间复杂度是O(n)。

顺便提一下,filter是一个内置函数的名字,所以你不应该把它当作变量名来用。

7

在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或库的时候。这些问题可能会让我们感到困惑,不知道该怎么解决。比如,有人可能在使用某个功能时,发现它并没有按照预期工作,这时候就需要去查找原因。

通常,我们可以通过查看文档、搜索网上的解决方案或者向其他开发者请教来找到答案。很多时候,社区里的人们会分享他们的经验和解决方案,这对我们来说是非常有帮助的。

记住,遇到问题是学习编程的一部分,不要害怕去探索和尝试不同的方法来解决它们。每次解决问题,都是在提升自己的技能。

>>> sorted(b, key=lambda x: filter.index(x['id']))
[{'id': 'a'}, {'id': 'c'}, {'id': 'e'}, {'id': 'b'}]
5

请记住,Ignacio 的解决方案其实就是你想避免的那种嵌套循环,也就是时间复杂度是 n^2 的方法。更高效的解决方案如下:

>>> filterdict = dict((k,i) for i,k in enumerate(filter))
>>> sorted(b, key=lambda x: filterdict[x['id']])
[{'id': 'a'}, {'id': 'c'}, {'id': 'e'}, {'id': 'b'}]

或者:

>>> b.sort(key=lambda x: filterdict[x['id']])
>>> b
[{'id': 'a'}, {'id': 'c'}, {'id': 'e'}, {'id': 'b'}]

这样可以就地排序。

补充:antonakos 的解决方案是最好的(2n),如果你的 ID 是唯一的(这通常是个安全的假设,但你没有说明,所以我不想随便假设)。以下是一个稍微简短的写法,希望能让他的意思更清楚:

>>> d = dict((i['id'], i) for i in b)
>>> [d[key] for key in filter]
[{'id': 'a'}, {'id': 'c'}, {'id': 'e'}, {'id': 'b'}]

撰写回答