要回答您的问题,您的第二个代码段不起作用的原因是 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)