排序不以lambda返回元组作为键参数

2024-09-28 22:25:15 发布

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

我正在尝试按几个条件对数组进行排序。Python的sorted函数可以将元组作为键。它还可以将lambda参数作为键。我尝试了一个lambda返回一个元组作为键,得到了TypeError: <lambda>() takes exactly 1 argument (2 given)和一个lambda元组,得到了TypeError: 'tuple' object is not callable。我在windows上使用python2.7.13。你知道吗

有人知道我为什么会出现这个错误,以及如何修复它吗?你知道吗

示例:

In [1]: message = {'tcu':1,'timestamps':{'device':23432}}

In [2]: message_array = [message, message]

In [3]: key = lambda message: (message['tcu'], message['timestamps']['device'])

In [4]: sorted(message_array,key)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-4-45bd2b89f64b> in <module>()
----> 1 sorted(message_array,key)

TypeError: <lambda>() takes exactly 1 argument (2 given)

In [5]: key = (lambda message: message['tcu'], lambda message: message['timestamps']['device'])

In [6]: sorted(message_array,key)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-6-45bd2b89f64b> in <module>()
----> 1 sorted(message_array,key)

TypeError: 'tuple' object is not callable

Tags: lambdakeyinmessagedeviceargumentarraygiven
2条回答

在python2.7中,函数sorted的签名是sorted(iterable[, cmp[, key[, reverse]]])。您正在传递一个键函数作为第二个参数,而实际上它是第三个参数。要始终确保向函数传递正确的内容,请使用命名参数。他说

message = {'tcu':1,'timestamps':{'device':23432}}
message_array = [message, message]
key = lambda message: (message['tcu'], message['timestamps']['device'])
sorted(message_array, key=key)

因为key应该是一个接受一个参数的函数,所以传入lambda的元组是没有意义的。他说

sorted函数的第二个参数不是key!!如果你打过去

sorted(message_array,key=key)

它起作用了。他说

这一定是一个常见的错误,这就是为什么Python3.x要求将键作为命名参数传递

相关问题 更多 >