Python类型错误: Must Use Keyword Argument for Key Function

本文介绍了简单而强大的方法来对项目列表进行排序,并在sort()方法中使用lambda函数。我们还讨论了为什么我们无法执行Python的sort()方法。

如何在 Python 中正确使用Key参数的 sort() 方法

有序数据是许多Web服务的核心。当我们执行搜索时,算法会返回一个有序的相关结果列表,而在网上购物时,我们通常希望按价格对产品进行排序。

当我们查看日历时,我们希望我们的约会按时间顺序排序。

让我们从一个经典的例子开始,按字母顺序排序。我们将使用六种碱土金属的列表。

它们是按原子序数排序的,但如果我们想按字母顺序排序呢?对于列表,我们调用sort()方法。

sort()方法假设您希望数据按字母顺序升序排序。如果您想以相反的顺序对数据进行排序,则可以调用sort()方法并指定reverse等于True

代码:

Earth_Metals=["Berylium","Magnisium","Calcium","strontium","Barium","Radium"]
Earth_Metals.sort()
print(Earth_Metals)

如果你看一下这个列表,名字是按字母顺序倒序排列的。

输出:

['Barium', 'Berylium', 'Calcium', 'Magnisium', 'Radium', 'strontium']

让我们重复这个例子,除了这一次,我们将元素存储在元组而不是列表中。当我们尝试对元组进行排序时,Python会抱怨并引发异常。

这个错误的原因是元组是不可变的对象。它们不能被改变,而排序会改变事情。

Earth_Metals=("Berylium","Magnisium","Calcium","strontium","Barium","Radium")
Earth_Metals.sort()
print(Earth_Metals)

输出:

AttributeError: 'tuple' object has no attribute 'sort'

在我们看一个更复杂的例子之前,让我们先看一下列表上的help()方法的sort文本。

sort方法接受两个关键字参数keyreverse。默认情况下,reverse设置为false,这意味着数据将按升序排序。

代码:

help(list.sort)

输出:

 

help text for the sort method on the list

 

让我们把重点放在行动所在的第一个论点上。要使用key参数,需要传入一个函数,该函数将用于确定排序所依据的值。

假设我们正在构建一个处理订单的应用程序,我们有一个订单项列表,列表中的每一项都是一个元组,其中包含两个项:产品名称和价格。让我们看看如果我们对这个列表进行排序并打印条目会发生什么。

代码:

items=[("product1",10),
      ("product2",9),
      ("product3",12)]
items.sort()
print(items)

输出:

[('product1', 10), ('product2', 9), ('product3', 12)]

当我们执行代码时,没有任何变化,因为Python不知道如何对这个列表进行排序。在这种情况下,我们需要定义Python的函数来对列表进行排序。

我们将通过使用lambda表达式或匿名函数使其更清晰,因此我们不必首先定义此函数,然后传递它。相反,我们添加lambda,编写lambda函数的语法是这样的,我们添加参数冒号,然后是表达式。

我们将只有一个参数;然后,在冒号(:)之后,我们返回一个值为1的项。

代码:

items=[("product1",10),
      ("product2",9),
      ("product3",12)]
items.sort(key=lambda item:item[1])
print(items)

输出:

[('product2', 9), ('product1', 10), ('product3', 12)]

一些初学者尝试给key参数给予多个参数值,并得到错误,因为key参数只接受一个值。我们无法执行代码的另一个原因是我们直接传递了函数,而不是使用key参数。