我在一本书中看到了如何将特定的排序函数传递给Python自己的内置sorted()函数,如下所示:
def mysort(a, b):
if a[3] < b[3]:
return -1
elif a[3] > b[3]:
return 1
else:
return 0
data = [
('Alpha Centauri A', 4.3, 0.26, 1.56),
('Alpha Centauri B', 4.3, 0.077, 0.45),
('Alpha Centauri C', 4.2, 0.00001, 0.00006),
("Barnard's Star", 6.0, 0.00004, 0.0005),
('Wolf 359', 7.7, 0.000001, 0.00002),
('BD +36 degrees 2147', 8.2, 0.0003, 0.006),
('Luyten 726-8 A', 8.4, 0.000003, 0.00006),
('Luyten 726-8 B', 8.4, 0.000002, 0.00004),
('Sirius A', 8.6, 1.00, 23.6),
('Sirius B', 8.6, 0.001, 0.003),
('Ross 154', 9.4, 0.00002, 0.0005),
]
sorted_data = sorted(data, mysort)上面的代码根据4元素元组的第4个元素对数据进行排序。这里,我试图弄清楚sorted()函数是如何将a和b参数提供给mysort函数的。我的意图是将另一个参数传递给mysort函数,类似于:
def mysort(a, b, i):
if a[i] < b[i]:
return -1
elif a[i] > b[i]:
return 1
else:
return 0它将告诉函数排序应该基于哪个元素。我很困惑,因为在排队的时候
sorted_data = sorted(data, mysort)我们不会向mysort函数传递任何参数。sorted()函数似乎发挥了它自己的魔力,并为mysort函数提供了a和b参数。总而言之,我想知道是否有一种方法可以为不同的排序类型向mysort函数添加第三个参数?
谢谢!
发布于 2013-04-19 06:04:19
您确实希望改用key参数;使用operator.itemgetter()对第4列进行排序
from operator import itemgetter
sorted(data, key=itemgetter(3))或者你可以使用lambda
sorted(data, key=lambda elem: elem[3])或者,您可以使用functools.partial()
from functools import partial
def mykeyfunc(column, item):
return item[column]
sorted(data, key=partial(mykeyfunc, 3))所有3个选项都会创建一个新的可调用对象,data中的每个项目都会传递该可调用对象。
在Python3中删除了sorted()的cmp参数。
发布于 2013-04-19 06:05:36
通常不会使用cmp (第二个参数)进行排序。key参数在99%的情况下都是最佳选择:
def mysort(item):
return item[3]
sorted_data = sorted(data, key=mysort)或者更简洁地说:
sorted_data = sorted(data, key=lambda item: item[3])要使第二个函数工作,您需要使用您的函数创建一个函数:
def mysort(i):
def sort_func(a, b)
if a[i] < b[i]:
return -1
elif a[i] > b[i]:
return 1
else:
return 0
return sort_func并像这样使用它:
sorted(data, mysort(3))但是更好的方法是使用一些内置的东西:
from operator imoprt itemgetter
sorted_data = sorted(data, key=itemgetter(3))https://stackoverflow.com/questions/16093848
复制相似问题