排序工作的关键参数如何?

时间:2016-11-08 09:19:41

标签: python python-3.x sorting parameters higher-order-functions

代码1:

>>> sorted("This is a test string from Andrew".split(), key=str.lower)
    ['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']

代码2:

>>> student_tuples = [
...     ('john', 'A', 15),
...     ('jane', 'B', 12),
...     ('dave', 'B', 10),
... ]
>>> from operator import itemgetter, attrgetter
>>>
>>> sorted(student_tuples, key=itemgetter(2))
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

为什么在代码1中,()中省略key=str.lower,如果包含括号则报告错误,但在key=itemgetter(2)的代码2中,括号是否保留?

2 个答案:

答案 0 :(得分:1)

sortedkey参数需要一个函数,sorted然后应用于要排序的事物的每个项目。在排序过程中,key(item)的结果会相互比较,而不是每个原始item

你可以想象它有点像这样:

def sorted(thing_to_sort, key):
    #
    # ... lots of complicated stuff ...
    #
            if key(x) < key(y):
                # do something
            else:
                # do something else
    #
    # ... lots more complicated stuff ...
    #
    return result

如您所见,括号()已添加到 key内的sorted 函数中,并将其应用于x和{{ 1}},它们是y

的项目

在您的第一个示例中,str.lower是应用于每个thing_to_sortx的函数。

itemgetter有点不同。这是返回另一个函数的函数,在您的示例中,其他函数将应用于yx

您可以在控制台中查看y的工作原理:

itemgetter

一开始可能有点难以理解“高阶”功能(接受或返回其他功能的功能),但它们对于许多不同的任务非常有用,所以值得尝试直到它们为止。你觉得很舒服。

答案 1 :(得分:-1)

稍微调整一下控制台 str.lower指的是方法&#39;降低&#39; &#39; str&#39;对象 并且str.lower()是一个函数,但是str.lower()需要一个参数,所以正确编写它将是str.lower("OH BOY")并且它将返回oh boy错误是因为你没有通过该函数的参数,但它期待一个。