0

我是 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
4

3 回答 3

2

你可以做:

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

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

于 2013-03-05T21:55:17.193 回答
2

是的。Lambda 语句:

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

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

lambda <arg...> : <statement>
于 2013-03-05T21:55:37.397 回答
2

如果你真的想避免定义函数,那就lambda无济于事了;这只是定义函数的另一种方式。您可以使用高阶函数来创建函数而不定义它们:

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

(您需要安装functional模块(或其他compose函数源),以及import两者functionaloperator。)

但我认为这是围绕“定义”的定义作弊,而且它肯定不是更蟒蛇。

同时,如果你只想要最漂亮、最 Python 或最可维护的代码……也许你已经得到了。

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

它还使调试变得更加容易。如果lambda foo: bar(baz(foo), qux(foo))没有做正确的事情,您必须尝试猜测它该做什么,然后才能修复它。如果函数有名字,你不必猜测——它应该按照名字的含义去做。

不合时宜地定义它也意味着您可以在多个地方使用它,而无需复制粘贴。

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

而且它通常更有效。

你所花费的只是一行浪费的代码。这真的不能接受吗?

显然,在足够简单的情况下,lambda它通常是可读的——否则,它一开始就不会出现在语言中。但它实际上从来没有必要,并且总是在简洁和明确之间进行权衡。

于 2013-03-05T22:14:12.310 回答