Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在排序函数中写入键函数_Python - Fatal编程技术网

Python 在排序函数中写入键函数

Python 在排序函数中写入键函数,python,Python,我是python新手,正在尝试对以下元组列表进行排序: >>> str [('991', 'Shantell'), ('992', 'Cherish'), ('993', 'Linsey'), ('994', 'Hali'), ('995', 'Tarah'), ('996', 'Annemarie'), ('997', 'Asha'), ('998', 'Jada'), ('999', 'Leila'), ('1000', 'Peggy')] 我想根据元组的第一个值对其进行

我是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
排序(str,key=int(str[0][0])) 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 已排序(str,key=int(str[0][0])) TypeError:“int”对象不可调用 您可以执行以下操作:

sorted(str,key=lambda x: int(x[0]))
lambda
创建一个内联函数,该函数与您的
数字键
等效(至少在本例中)。我不确定这是否“更漂亮”,但它不太冗长,而且大多数人可能会使用它。

您可以:

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

lambda
创建一个内联函数,该函数与您的
数字键
等效(至少在本例中)。我不确定这是否“更漂亮”,但它不那么冗长,而且大多数人可能会使用它。

是的。Lambda声明:

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

lambda <arg...> : <statement>
lambda:

是。Lambda声明:

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

lambda <arg...> : <statement>
lambda:

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

sorted(str, key=functional.compose(int, operator.itemgetter(0)))
(您需要安装模块(或
编写
功能的其他来源),以及
导入
功能和
操作员

但我认为这是对“定义”定义的一种欺骗,而且肯定不是更像蟒蛇

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

为函数命名通常会使其更具可读性

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

定义它也意味着可以在多个位置使用它,而无需复制粘贴

您可以对其进行单元测试

而且通常效率更高

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


显然,在足够简单的情况下,
lambda
通常是可读的,否则,它就不会出现在语言中。但实际上它从来都不是必需的,而且在简洁性和明确性之间总是有一个折衷。

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

sorted(str, key=functional.compose(int, operator.itemgetter(0)))
(您需要安装模块(或
编写
功能的其他来源),以及
导入
功能和
操作员

但我认为这是对“定义”定义的一种欺骗,而且肯定不是更像蟒蛇

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

为函数命名通常会使其更具可读性

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

定义它也意味着可以在多个位置使用它,而无需复制粘贴

您可以对其进行单元测试

而且通常效率更高

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


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

你想用
str[0][0]
做什么作为旁注,
str
是一种内置类型。您可能最好将变量命名为其他名称:)谢谢。。。。我以后会记住:)将
数字键
作为命名函数有什么不对?如果您想在多个地方使用它,单元测试它,请求调试它的帮助,6个月后自己调试它,您会非常高兴您已经将它定义为一个单独的函数。而你所花费的只是一行浪费的代码。这真的不可接受吗?@abarnert:我想做的就是将元组的第一个元素转换为整数,因为int()是一个BIF,所以我并不打算为此创建一个新函数。但是为复杂的关键函数运行单元测试用例的想法绝对值得。我从来没有考虑过在发布这个问题时需要对我的关键功能进行单元测试。。。。现在我想了想,并了解了python中的lamda函数……我同意拥有一个单独的函数并不太糟糕。@tomkaith13:问题是您调用了两个函数:
[0]
(它没有内置的等效函数,b