python排序错误:TypeError:';列表';对象不可调用
我试图根据每个元素的第一项对列表进行排序:python排序错误:TypeError:';列表';对象不可调用,python,list,python-2.7,sorting,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。预期结果应该是:[[1100],[3,30],[5200]] 但是,我得到了以下错误: TypeErrorTracebac
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。预期结果应该是:[[1100],[3,30],[5200]]
但是,我得到了以下错误:
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
TypeErrorTraceback(最近一次调用上次)
在()
3.
4 my_x=[[1100]、[5200]、[3,30]]
---->5我的乐趣(我的x)
在myFun(x)
1 def myFun(x):
---->2返回排序(x,key=getKey(x))
3.
4 my_x=[[1100]、[5200]、[3,30]]
5我的乐趣(我的x)
TypeError:“列表”对象不可调用
知道我做错了什么吗?谢谢 更新
sorted
的key
属性应该是可调用的,因此您需要key=getKey
而不是分配key=getKey()
初始答案(如果您想让代码看起来更好,可能会很有用):
没有像getKey
这样的方法,但是有来自包的方法
给下层选民:
说得很清楚
我希望根据每个元素的第一项进行排序
如果您认为只使用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]]
因此,排序
并不像OP所希望的那样,只基于第一个参数
初始答案的更新
另外,当我回答没有getKey
方法时,您可以查看
因此OP post现在有了getKey
方法,您可以查看相应的@MosesKoledoye的您不需要调用函数getKey
。的签名要求您将键
参数作为可调用参数传递:
sorted(x, key=getKey)
问题是您正在将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)
话虽如此,如果您只是基于第一个元素进行排序,那么这就是排序的默认行为
您只需执行排序(x)
getKey
是一个函数(一种“可调用”对象)。另一方面,它的输出,getKey(x)
,是一个不可调用的列表
对象。您的错误是,您正在设置key=getKey(x)
,因此为参数key
指定了一个list
对象,而sorted
希望该名称附带可调用的内容。这就解释了为什么当内部排序代码试图调用您的键时,它会失败,并出现错误“'list'对象不可调用”。真的,如果你来这里,你应该说key=getKey
,因为你的错误与问题中提到的完全相同
TypeError:“list”对象不可调用
很可能你只是做了如下事情:
sorted = sorted(someList)
如果变量名从sorted更改为其他名称,则错误将消失,如
sortedList = sorted(someList)
什么是getKey
?我想您需要的是key=operator.itemgetter(0)
@inspectorG4dget,这根本不需要。这是排序后的的默认行为。对不起,我有getKey,忘了把它放在问题中。请参阅编辑。这修复了OP的代码,但无法帮助他们找出错误所在。另外,这是排序的的默认行为。您甚至不需要itemgetter
。最后,OP的代码中显然有一个getKey
,否则将是另一个错误。对不起,我有getKey,忘了把它放在问题中。请参见编辑。@MorganThrapp我正在注意代码片段。我已经更新了答案。这仍然有一个问题,那就是没有真正显示出他们做错了什么。此外,即使帖子中没有getKey
的定义,它仍然明显存在,否则OP的问题将是namererror
。是的,在重复项的情况下,默认排序行为与OP的实现略有不同,但我不太愿意称之为故意的。
sortedList = sorted(someList)