在排序函数中写入键函数

2024-10-04 03:19:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我是python新手,正在尝试对以下元组列表进行排序:

>>> str
[('991', 'Shantell'), ('992', 'Cherish'), ('993', 'Linsey'), ('994', 'Hali'), ('995', 'Tarah'), ('996', 'Annemarie'), ('997', 'Asha'), ('998', 'Jada'), ('999', 'Leila'), ('1000', 'Peggy')]

我想根据元组的第一个值对它进行排序,但不幸的是,每个元组的第一个值都是字符串而不是整数。我知道我可以创建一个键函数来执行以下操作:

def digit_key(t):
    return (int(t[0]))

然后按如下顺序调用:

>>> sorted(str,key=digit_key)
[('991', 'Shantell'), ('992', 'Cherish'), ('993', 'Linsey'), ('994', 'Hali'), ('995', 'Tarah'), ('996', 'Annemarie'), ('997', 'Asha'), ('998', 'Jada'), ('999', 'Leila'), ('1000', 'Peggy')]

在排序之前我是否总是要定义键函数?? 有没有一种更漂亮的方法来编写这个代码而不必为它定义两个函数?? 我尝试了以下操作但失败了:

>>> sorted(str,key= int(str[0][0]))
Traceback (most recent call last):
  File "<pyshell#1112>", line 1, in <module>
    sorted(str,key= int(str[0][0]))
TypeError: 'int' object is not callable

Tags: key函数排序int元组sortedstrhali
3条回答

你可以做:

sorted(str,key=lambda x: int(x[0]))

lambda创建了一个内联函数,它与您的digit_key等价(至少在本例中是这样)。我不确定这是否“更漂亮”,但它不那么冗长,而且大多数人可能会用它。你知道吗

如果您真的想避免定义函数,lambda没有帮助;它只是定义函数的另一种方式。您可以使用高阶函数来创建函数,而无需定义它们:

sorted(str, key=functional.compose(int, operator.itemgetter(0)))

(您将需要安装^{}模块(或compose函数的其他一些源代码),以及importfunctionaloperator

但我认为这是对“define”定义的一种欺骗,而且肯定不是更像python。你知道吗

同时,如果你只想要最漂亮的,或者最有活力的,或者最可维护的代码…也许你已经得到了。你知道吗

给函数起一个名字通常会使它更具可读性。你知道吗

它还使调试更加容易。如果lambda foo: bar(baz(foo), qux(foo))没有做正确的事情,你必须试着猜测它应该做什么,然后才能修复它。如果函数有一个名字,你不必猜测它应该做的是名字所暗示的。你知道吗

定义它也意味着您可以在多个地方使用它,而无需复制粘贴。你知道吗

你可以对它进行单元测试。你知道吗

而且通常效率更高。你知道吗

你只需要浪费一行代码。这真的不能接受吗?你知道吗

显然,在足够简单的情况下,lambda通常是可读的,否则,它就不会在语言中放在第一位。但它实际上从来没有必要,而且在简洁和明确之间总是有一个折衷。你知道吗

是的。Lambda语句:

sorted(str, key= lambda a: (int(a[0])) )

基本上,这是一种声明内联函数的简洁方法。语法是lambda关键字,后跟参数(用逗号分隔)、冒号,然后是函数返回的语句:

lambda <arg...> : <statement>

相关问题 更多 >