2016-09-27 54 views
-3

我想排序基于每个元素的第一个项目列表的列表:蟒蛇排序错误:类型错误:“名单”对象不是可调用

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 

任何想法,我做错了什么吗?谢谢!

+3

什么是'getKey'? –

+0

我想你想'key = operator.itemgetter(0)' – inspectorG4dget

+0

@ inspectorG4dget这甚至不需要。这是'sorted'的默认行为。 –

回答

-1

UPDATE

sortedkey属性应该是可调用的,所以不是分配key=getKey()需要key=getKey

最初的回答(如果你想使代码看起来更可能是有用的) :

有没有这样的方法getKey,但itemgetteroperator

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

它明确表示,

I want the sorting based on the first item of each element

而且,如果你认为你只用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想

初步回答的Update

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

等OP后现在有getKey方法你可以看看相应的@MosesKoledoye的answer

+1

这修复了OP的代码,但并没有帮助他们弄清楚他们做错了什么。另外,这是'sorted'的默认行为。你甚至不需要'itemgetter'。最后,在OP的代码中显然有一个'getKey',否则它将会是一个不同的错误。 –

+0

对不起,我有getKey,忘了把它放在问题中。请参阅编辑。 – Edamame

+0

@MorganThrapp我正在关注代码片段。我已经更新了答案。 –

2

您不需要调用函数getKey。的sorted签名要求你通过key参数作为调用的:

sorted(x, key=getKey) 
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

getKey是一个函数,(一种“可调用”对象)。另一方面,其输出getKey(x)list对象,其是而不是可调用。您的错误是您设置了key=getKey(x),因此将list对象指定给参数key,而sorted需要将某个对象附加到该名称。所以这就解释了为什么当内部排序代码尝试调用你的key时,它会失败,并显示错误“'list'object is callable”。真的,你应该只说key=getKey

相关问题