我正在尝试根据每个元素的第一项对列表进行排序:
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
知道我在这里做错了吗?谢谢!
答案 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)
您不需要调用函数getKey
。 sorted
的签名要求您将key
参数作为可调用对象传递:
sorted(x, key=getKey)
答案 2 :(得分:1)
getKey(x)
是一个函数,(一种“可调用”对象)。另一方面,它的输出list
是key=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)