列表或元组是一个函数吗? (尝试使用元组作为sorted()函数中的键。)

时间:2013-07-14 05:00:42

标签: python python-2.7

我是一个初学者学习python并做了一些python exercises,我有一个通用的问题,为什么一段代码工作而另一段没有。 我在下面写的这段代码很好用:

def sort_last(tuples):
  def MyFn(tuples):
    return tuples[-1]
  a = sorted(tuples, key=MyFn)
  return a

直觉上我认为这可能会起作用并尝试过。它没有:

def sort_last(tuples):
  a = sorted(tuples, key=tuples[-1])
  return a

有人会解释为什么第二件不起作用? 我查了一下:#sorted 是因为列表或元组不是函数吗?是因为它不止一个论点吗?

提前致谢!

3 个答案:

答案 0 :(得分:4)

来自文档:

  

key指定用于提取a的一个参数的函数   每个列表元素的比较键

因此,您可以使用一个参数传递可调用对象。你可以用lambda重写第二个例子:

def sort_last(tuples):
    return sorted(tuples, key=lambda t: t[-1])

或者,正如@ ersran9所建议的那样,您可以使用operator.itemgetter

import operator

def sort_last(tuples):
    return sorted(tuples, key=operator.itemgetter(-1))

答案 1 :(得分:0)

要回答您的问题,您的第二个代码段不起作用的原因是,排序函数的“key”参数应该包含项目排序权重的配方。 sorted()函数将在您正在排序的列表中的每个项目上运行此配方。当你说key = tuples [-1]时,表达式“tuples [-1]”会立即被评估一次。该评估的结果是列表中的最后一个元组,它被传递到已排序的函数中。排序函数期望可以执行的配方(函数);它会得到一个元组,而元组则无法执行。 (无论如何,执行元组甚至意味着什么?)

当你说“元组[-1]”时,你正在运行一个计算来从变量中提取最后一个元素。当你说“MyFn”时,你指的是没有运行它的食谱。如果你想要一个看起来像“元组[-1]”的语法,你可以使用lambda运算符,如很快的答案中所述。

为了看到这一点,我们可以遵循我的个人编程格言:“如果有疑问,请打印出来。”如果您不完全了解您的程序正在做什么,您可以在所有地方插入打印语句,以便更好地了解正在发生的事情。

以下是您的程序版本,其中包含一些信息性的打印声明:

def MyFn(tuples):
    print "inside MyFn: tuples =", tuples, "returning", tuples[-1]
    return tuples[-1]

tuples = [("a", 3), ("b", 2), ("c", 1)]
print "sorting: tuples =", tuples

a = sorted(tuples, key=MyFn)
print "the sorted list is", a

并且输出信息非常丰富:

sorting: tuples = [('a', 3), ('b', 2), ('c', 1)]
inside MyFn: tuples = ('a', 3) returning 3
inside MyFn: tuples = ('b', 2) returning 2
inside MyFn: tuples = ('c', 1) returning 1
the sorted list is [('c', 1), ('b', 2), ('a', 3)]

如您所见,“已排序”库函数会调用您的MyFn配方三次!

此输出还显示您的代码存在一些样式问题。您在程序的不同位置使用变量名“tuples”来表示不同的事物。在MyFn中,名称是指单个元组,而在外部级别,它指的是元组的初始未排序列表。你的代码有效,但令人困惑!我建议使用另一个变量作为MyFn的参数,如下所示:

def MyFn(e):
    return e[-1]

tuples = [("a", 3), ("b", 2), ("c", 1)]
a = sorted(tuples, key=MyFn)

答案 2 :(得分:-2)

这是False Code Dont Put函数在Other函数中; 使用OOP编程或取出功能(MyFn)> 像这样:

def sort_last(tuples):
   a = sorted(tuples, key=MyFn)
   return a
def MyFn(tuples):
   return tuples[-1]
tubles=("var","share","far","Bar")
print MyFn(tubles)
print sort_last(tubles)

或者通过OOP编程:

#!/usr/bin/python
class Mr_sam:
        def sort_last(self,tuples):
                self.tubles=tubles
                a = sorted(tuples, key=self.MyFn)
                return a
        def MyFn(self,tuples):
                self.tubles=tubles
                return tuples[-1]
tubles=("var","share","far","Bar")
Go=Mr_sam() #Take a Object from class Mr_sam Go is a copy from Mr_sam
print Go.sort_last(tubles);Go.MyFn(tubles) # take the 2 attribute from Object Go