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

标签 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中省略了(),如果带括号就报错,而代码2中的 key=itemgetter(2),括号被保留?

最佳答案

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,应用它到 xy,它们是 thing_to_sort 的项目。

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

itemgetter有点不同。这是一个返回另一个函数的函数,在您的示例中,另一个函数被应用于xy.

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

>>> from operator import itemgetter
>>> item = ('john', 'A', 15)
>>> func = itemgetter(2)
>>> func(item)
15

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

关于python - 排序的关键参数是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40483078/

相关文章:

javascript - 根据特定规则对对象进行排序

Python-查找子字符串然后替换其中的所有字符

python - 将 Json 数据保存到 Sqlite Python

python - 在一行中输入 2 个用逗号分隔的变量

python - 嵌入 Python Zip 文件会抛出错误?

python - 编写一个程序,要求用户输入 5 个数字,并输出这些数字中最大的数字和最小的数字。

c - C中字符串的奇怪排序

python - 为什么这不打印所有内容而只给出文件中的总字数?

python - 弹出前 N 个元素

c++ - 在 C++ 中对 float 组进行排序