按任意lambda排序

46 python sorting

如何通过任意函数描述的键对列表进行排序?例如,如果我有:

mylist = [["quux", 1, "a"], ["bar", 0, "b"]]
Run Code Online (Sandbox Code Playgroud)

我想通过每个成员的第二个元素来排序"mylist",例如

sort(mylist, key=lambda x: x[1])
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

Sco*_*ord 49

你基本上已经拥有它了:

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

得到:

[['bar', 0, 'b'], ['quux', 1, 'a']]
Run Code Online (Sandbox Code Playgroud)

这将对mylist进行排序.

[这篇文章感谢@ Daniel的更正.] sorted将返回一个新的列表,该列表已经过排序而不是实际更改输入,如http://wiki.python.org/moin/HowTo/Sorting/中所述.


Ste*_*hen 9

你有两个选择,非常接近你所描述的,实际上:

mylist.sort(key=lambda x: x[1]) # In place sort
new_list = sorted(mylist, key=lambda x: x[1])
Run Code Online (Sandbox Code Playgroud)


Wil*_*hen 9

这是一个常见的需求,它的支持已经添加到标准库中,形式如下operator.itemgetter:

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


小智 5

答案是使用“排序”,即

sorted(mylist, key=lambda x: x[1])
Run Code Online (Sandbox Code Playgroud)


riz*_*iza 5

Sort和itemgetter是最快的.

>>> import operator
>>> import timeit

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

>>> t2 = timeit.Timer(lambda: mylist.sort(key=operator.itemgetter(1)))
>>> t2.timeit()
1.3985503043467773

>>> t3 = timeit.Timer(lambda: sorted(mylist, key=operator.itemgetter(1)))
>>> t3.timeit()
2.6329514733833292

>>> t4 = timeit.Timer(lambda: sorted(mylist, key=lambda x: x[1]))
>>> t4.timeit()
2.9197154810598533
Run Code Online (Sandbox Code Playgroud)