在sort函数中写入键函数

时间:2013-03-05 21:53:50

标签: 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

3 个答案:

答案 0 :(得分:2)

你可以这样做:

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

lambda创建一个内联函数,它与digit_key等效(至少在这种情况下)。我不确定这是否“更漂亮”,但它不那么冗长,也是大多数人可能会使用的。

答案 1 :(得分:2)

是。 Lambda陈述:

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

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

lambda <arg...> : <statement>

答案 2 :(得分:2)

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

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

(您需要安装functional模块(或compose功能的其他来源)和import functionaloperator 。)

但是我觉得这种做法在“定义”的定义上有些作弊,而且它肯定不是更加pythonic。

与此同时,如果您只想要最漂亮,最恐怖或最易维护的代码......也许您已经拥有它了。

赋予函数名称通常会使其更具可读性。

它还使调试更容易。如果lambda foo: bar(baz(foo), qux(foo))没有做正确的事情,那么在修复它之前,你必须尝试猜测所谓的正在做什么。如果函数有一个名字,你就不必猜测它应该按照名字所暗示的那样做。

将其定义为脱节也意味着您可以在多个位置使用它,而无需复制粘贴。

你可以进行单元测试。

而且效率通常更高。

所有这些都花费了你一行浪费的代码。这真的不被接受吗?

显然,在简单的情况下,lambda通常是可读的 - 否则,它首先不会出现在语言中。但它实际上从来都不是必需的,而且在简洁和明确之间总是存在权衡。