如何使用任意函數描述的鍵對列表進行排序?例如,如果我有:按任意lambda排序
mylist = [["quux", 1, "a"], ["bar", 0, "b"]]
我想用每一個構件,例如第二元件排序「MYLIST」
sort(mylist, key=lambda x: x[1])
我該怎麼做?
如何使用任意函數描述的鍵對列表進行排序?例如,如果我有:按任意lambda排序
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/中所述。
很好的區分,謝謝。 – user248237dfsf 2010-07-09 20:50:29
的答案是使用 「分類」,即
sorted(mylist, key=lambda x: x[1])
我有參數向後。似乎不一致,例如map/filter/reduce採用lambda第一個參數並列出第二個參數,但是排序相反。 – javadba 2017-04-29 20:17:20
你有兩個選擇,非常接近你所描述的,實際上是:
mylist.sort(key=lambda x: x[1]) # In place sort
new_list = sorted(mylist, key=lambda x: x[1])
這是一個通用的需求,對於已經添加到標準庫,在operator.itemgetter
形式支持:
from operator import itemgetter
mylist = [["quux", 1, "a"], ["bar", 0, "b"]]
mylist.sort(key=itemgetter(1)) # or sorted(mylist, key=...)
排序和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
當您嘗試使用您提供的代碼時,會出現什麼問題? – tzot 2010-07-11 09:17:19