按任意lambdasorting

我怎样才能按任意函数描述的关键字sorting列表? 例如,如果我有:

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

我想按每个成员的第二个元素来sorting“mylist”,例如

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

我怎样才能做到这一点?

你基本上已经有了:

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

得到:

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

这将sortingmylist。

[编辑本段]感谢@ Daniel的更正。] sorted将按照http://wiki.python.org/moin/HowTo/Sorting/中的描述返回一个新的列表,这个列表被sorting而不是真正改变input。;

这是一个常见的需求,它已经以operator.itemgetter的forms被添加到标准库中:

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

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

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

答案是使用“sorting”,即

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

sorting和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