按任意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