按任意lambda排序

54 投票
6 回答
46992 浏览
提问于 2025-04-16 01:04

我该如何根据一个任意函数描述的关键字来对列表进行排序呢?比如说,如果我有:

mylist = [["quux", 1, "a"], ["bar", 0, "b"]]

我想根据每个成员的第二个元素来排序“mylist”,比如:

sort(mylist, key=lambda x: x[1])

我该怎么做呢?

6 个回答

10

这个需求非常常见,所以在标准库中增加了对它的支持,具体是通过operator.itemgetter这个工具来实现的:

from operator import itemgetter
mylist = [["quux", 1, "a"], ["bar", 0, "b"]]
mylist.sort(key=itemgetter(1)) # or sorted(mylist, key=...)
10

其实你有两个选择,跟你描述的非常接近:

mylist.sort(key=lambda x: x[1]) # In place sort
new_list = sorted(mylist, key=lambda x: x[1])
55

你基本上已经有了:

>>> mylist = [["quux", 1, "a"], ["bar", 0, "b"]]
>>> mylist.sort(key=lambda x: x[1])
>>> print mylist

这会得到:

[['bar', 0, 'b'], ['quux', 1, 'a']]

这段代码会直接对 mylist 进行排序。

[这一段感谢 @Daniel 的纠正进行了编辑。] sorted 会返回一个新的已排序列表,而不是直接改变原来的输入,具体可以参考这个链接:http://wiki.python.org/moin/HowTo/Sorting/

撰写回答