Python内置的sorted()函数

mar*_*ion 0 python sorting arguments function

我在书中看到如何将特定的排序函数传递给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)
Run Code Online (Sandbox Code Playgroud)

上面的代码根据4元素元组的第4个元素对数据进行排序.在这里,我试图找出sorted()函数如何为函数提供ab参数mysort.我的意图是将另一个参数传递给mysort函数,类似于:

def mysort(a, b, i):
    if a[i] < b[i]:
        return -1
    elif a[i] > b[i]:
        return 1
    else:
        return 0
Run Code Online (Sandbox Code Playgroud)

它将告诉函数哪个元素应该基于排序.我很困惑,因为在线

sorted_data = sorted(data, mysort)
Run Code Online (Sandbox Code Playgroud)

我们不会将任何参数传递给mysort函数.该sorted()函数似乎有自己的魔力,并为函数提供ab参数mysort.总结一下,我想知道是否有办法为mysort函数添加第三个参数以用于不同的排序类型?

谢谢!

Mar*_*ers 5

你真的想要使用这个key参数; 在第4列排序operator.itemgetter():

from operator import itemgetter

sorted(data, key=itemgetter(3))
Run Code Online (Sandbox Code Playgroud)

或者您可以使用lambda:

sorted(data, key=lambda elem: elem[3])
Run Code Online (Sandbox Code Playgroud)

或者您可以使用functools.partial():

from functools import partial

def mykeyfunc(column, item):
    return item[column]

sorted(data, key=partial(mykeyfunc, 3))
Run Code Online (Sandbox Code Playgroud)

所有3个选项都创建一个新的 callable,传递给每个项目data.

cmp给的说法sorted()已经在Python 3被删除.