python排序错误:TypeError:' list'对象不可调用

时间:2016-09-27 17:02:42

标签: python list python-2.7 sorting

我正在尝试根据每个元素的第一项对列表进行排序:

def getKey(item):
    return item[0]    

def myFun(x):
    return sorted(x, key= getKey(x))

my_x = [[1,100], [5,200], [3,30]]

myFun(my_x)

我希望根据每个元素的第一项进行排序,即1,5和3.预期结果应为:[[1,100], [3,30], [5,200]]

但是,我收到了以下错误:

TypeErrorTraceback (most recent call last)
<ipython-input-7-4c88bbc1a944> in <module>()
      3 
      4 my_x = [[1,100], [5,200], [3,30]]
----> 5 myFun(my_x)

<ipython-input-7-4c88bbc1a944> in myFun(x)
      1 def myFun(x):
----> 2     return sorted(x, key= getKey(x))
      3 
      4 my_x = [[1,100], [5,200], [3,30]]
      5 myFun(my_x)

TypeError: 'list' object is not callable

知道我在这里做错了吗?谢谢!

5 个答案:

答案 0 :(得分:3)

问题是您要将getKey(x)的结果分配给key=getKey(x)。您想要分配函数指针。

def getKey(item):
    return item[0]    

def myFun(x):
    return sorted(x, key=getKey)

my_x = [[1,100], [5,200], [3,30]]

myFun(my_x)

话虽如此,如果你只是根据第一个元素进行排序,那就是sorted的默认行为。

您可以sorted(x)

答案 1 :(得分:2)

您不需要调用函数getKeysorted的签名要求您将key参数作为可调用对象传递:

sorted(x, key=getKey)

答案 2 :(得分:1)

getKey(x)是一个函数,(一种“可调用”对象)。另一方面,它的输出listkey=getKey(x)对象,可调用。您的错误是您正在设置list并因此为参数key分配sorted对象,而key期望附加到该名称的可调用内容。这就解释了为什么当内部排序代码试图调用你的key=getKey时,它会失败并显示错误“'list'对象不可调用”。真的,你应该刚才说Public Overridable Property Balance() As Decimal Get Return balanceValue End Get Set(balance As Decimal) If balance >= 0D Then balanceValue = balance Else Throw New ArgumentOutOfRangeException("Balance must be greater than or equal to 0") End If End Set End Property

答案 3 :(得分:0)

<强>更新

sorted key属性应该是可调用的,因此您需要key=getKey()

而不是分配key=getKey

INITIAL ANSWER (如果您想让代码看起来更好,可能会有用):

没有getKey这样的方法,但是来自itemgetter包的operator

from operator import itemgetter


def myFun(x):
    return sorted(x, key=itemgetter(0))

my_x = [[1,100], [5,200], [3,30]]

myFun(my_x)

对于downvoters

它清楚地说过

  

我希望根据每个元素的第一项进行排序

如果您认为仅使用sorted()对提交的列表进行排序,那就错了。

>>> my_x = [[1,100], [5,200], [3,30], [1,30]]
>>> myFun(my_x)
[[1, 100], [1, 30], [3, 30], [5, 200]]
>>> sorted(my_x)
[[1, 30], [1, 100], [3, 30], [5, 200]]

所以sorted不仅仅基于第一个参数,因为OP想要

初步回答

此外,当我回答没有getKey方法时,您可以查看OP post edit history

所以OP发布现在有getKey方法,您可以查看相应的@MosesKoledoye&#39; s answer

答案 4 :(得分:0)

如果您来这里是因为遇到了与问题中提到的错误完全相同的错误

TypeError: 'list' object is not callable

机会是您只是做了以下事情?

sorted = sorted(someList) 

如果变量名称从排序更改为其他名称(例如

),错误将消失
sortedList = sorted(someList)