【发布时间】:2010-07-09 20:40:26
【问题描述】:
如何通过任意函数描述的键对列表进行排序?例如,如果我有:
mylist = [["quux", 1, "a"], ["bar", 0, "b"]]
我想按每个成员的第二个元素对“mylist”进行排序,例如
sort(mylist, key=lambda x: x[1])
我该怎么做?
【问题讨论】:
-
您尝试提供的代码时遇到了什么问题?
如何通过任意函数描述的键对列表进行排序?例如,如果我有:
mylist = [["quux", 1, "a"], ["bar", 0, "b"]]
我想按每个成员的第二个元素对“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']]
这将对 mylist 进行适当的排序。
[感谢@Daniel 的更正,此段落已编辑。]sorted 将返回一个已排序的新列表,而不是实际更改输入,如http://wiki.python.org/moin/HowTo/Sorting/ 中所述。
【讨论】:
实际上,您有两个选择,非常接近您的描述:
mylist.sort(key=lambda x: x[1]) # In place sort
new_list = sorted(mylist, key=lambda x: x[1])
【讨论】:
您的问题的解决方案是:
sorted_list = sorted(mylist, key=lambda value:value[1])
列表字典的解决方案是:
mylist = [{'name':'kk', 'age':21},{'name':'bk', 'age':21}]
sorted_list = sorted(mylist, key=lambda k: k['key_name'])
【讨论】:
这是一个非常普遍的需求,标准库已经添加了对它的支持,形式为operator.itemgetter:
from operator import itemgetter
mylist = [["quux", 1, "a"], ["bar", 0, "b"]]
mylist.sort(key=itemgetter(1)) # or sorted(mylist, key=...)
【讨论】:
答案是使用“排序”,即
sorted(mylist, key=lambda x: x[1])
【讨论】:
排序和 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
【讨论】: