【问题标题】:python sorting error: TypeError: 'list' object is not callablepython排序错误:TypeError:'list'对象不可调用
【发布时间】:2016-09-27 17:02:41
【问题描述】:

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

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

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

【问题讨论】:

  • 什么是getKey
  • 我想你想要key=operator.itemgetter(0)
  • @inspectorG4dget 这甚至不需要。这是sorted 的默认行为。
  • 对不起,我有 getKey,忘了把它放在问题中。请参阅编辑。

标签: python list python-2.7 sorting


【解决方案1】:

问题是您将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)

【讨论】:

    【解决方案2】:

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

    sorted(x, key=getKey)
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        更新

        sortedkey 属性应该是可调用的,因此您需要分配key=getKey() 而不是key=getKey

        初始答案(如果您想让代码看起来更好,可能会很有用):

        没有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)
        

        致反对者

        说的很清楚

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

        如果您认为只使用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 的 answer

        【讨论】:

        • 这修复了 OP 的代码,但不能帮助他们弄清楚他们做错了什么。此外,这是sorted 的默认行为。你甚至不需要itemgetter。最后,在 OP 的代码中显然有一个 getKey,否则将是一个不同的错误。
        • 对不起,我有 getKey,忘了把它放在问题中。请参阅编辑。
        • @MorganThrapp 我正在关注代码 sn-p。我已经更新了答案。
        • 这仍然存在实际上没有向 OP 展示他们做错了什么的问题。此外,即使帖子中没有 getKey 的定义,它仍然明显存在,否则 OP 的问题将是 NameError。是的,在重复项目的情况下,默认排序行为与 OP 的实现略有不同,但我会犹豫是否称其为故意的。
        【解决方案5】:

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

        TypeError: 'list' object is not callable

        您可能只是做了以下类似的事情:

        sorted = sorted(someList) 
        

        如果变量名从 sorted 更改为其他名称,则错误将消失,例如

        sortedList = sorted(someList)
        

        【讨论】:

          猜你喜欢
          • 2012-04-21
          • 2014-06-13
          • 2015-09-14
          • 1970-01-01
          • 1970-01-01
          • 2020-06-24
          • 2021-12-23
          • 1970-01-01
          相关资源
          最近更新 更多