0

我是一个学习 python 并做一些python 练习的初学者,我有一个一般性的问题,即为什么一段代码有效而另一段代码无效。我在下面写的这段代码工作得很好:

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 是不是因为列表或元组不是函数?是因为它不止一个论点吗?

提前致谢!

4

3 回答 3

4

从文档:

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

因此,您可以使用一个参数传递一个可调用对象。你可以用 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))
于 2013-07-14T05:14:36.557 回答
0

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

当您说“元组 [-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 配方 3 次!

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

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

tuples = [("a", 3), ("b", 2), ("c", 1)]
a = sorted(tuples, key=MyFn)
于 2013-07-14T07:47:45.937 回答
-2

这是错误代码不要将函数放在其他函数中;使用 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 
于 2013-07-14T05:54:24.577 回答