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

时间:2018-07-11 09:42:04

标签: python python-2.7 sorting

我正在尝试通过几个条件对数组进行排序。 Python的sorted函数可以将元组用作键。它还可以将lambda参数作为键。我尝试了一个lambda,它返回一个元组作为键,并得到TypeError: <lambda>() takes exactly 1 argument (2 given)和一个lambdas的元组,得到TypeError: 'tuple' object is not callable。我在Windows上使用的是Python 2.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

2 个答案:

答案 0 :(得分:3)

在Python 2.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元组没有任何意义。

答案 1 :(得分:2)

sorted函数的第二个参数不是key!如果您通过以下方式致电

sorted(message_array,key=key)

有效。

肯定是一个常见错误,这就是python 3.x要求将键作为命名参数传递的原因