代码1:
>>> sorted("This is a test string from Andrew".split(), key=str.lower)
['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']
代码2:
>>> student_tuples = [
... ('john', 'A', 15),
... ('jane', 'B', 12),
... ('dave', 'B', 10),
... ]
>>> from operator import itemgetter, attrgetter
>>>
>>> sorted(student_tuples, key=itemgetter(2))
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
为什么代码1中,key=str.lower
中省略了()
,如果带括号就报错,而代码2中的 key=itemgetter(2)
,括号被保留?
最佳答案
sorted
的 key
参数需要一个函数,sorted
然后将其应用于要排序的事物的每个项目。在排序过程中,key(item)
的结果会相互比较,而不是每个原始item
。
你可以想象它的工作方式有点像这样:
def sorted(thing_to_sort, key):
#
# ... lots of complicated stuff ...
#
if key(x) < key(y):
# do something
else:
# do something else
#
# ... lots more complicated stuff ...
#
return result
如您所见,括号()
被添加到函数key
内部sorted
,应用它到 x
和 y
,它们是 thing_to_sort
的项目。
在第一个示例中,str.lower
是应用于每个 x
和 y
的函数。
itemgetter
有点不同。这是一个返回另一个函数的函数,在您的示例中,另一个函数被应用于x
和y
.
您可以在控制台中查看 itemgetter
的工作原理:
>>> from operator import itemgetter
>>> item = ('john', 'A', 15)
>>> func = itemgetter(2)
>>> func(item)
15
一开始可能有点难以理解“高阶”函数(接受或返回其他函数的函数),但它们对于许多不同的任务非常有用,因此值得尝试它们,直到你感觉很舒服。
关于python - 排序的关键参数是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40483078/