我正在尝试通过几个条件对数组进行排序。 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
答案 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要求将键作为命名参数传递的原因