operator.itemgetter和sort()在Python中是如何工作的?

2024-09-29 21:50:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下代码:

# initialize
a = []

# create the table (name, age, job)
a.append(["Nick", 30, "Doctor"])
a.append(["John",  8, "Student"])
a.append(["Paul", 22, "Car Dealer"])
a.append(["Mark", 66, "Retired"])    

# sort the table by age
import operator
a.sort(key=operator.itemgetter(1))    

# print the table
print(a)

它创建一个4x3表,然后按年龄进行排序。我的问题是,key=operator.itemgetter(1)到底做了什么?operator.itemgetter函数是否返回项的值?为什么我不能在那里键入类似key=a[x][1]的内容?还是我可以?with operator怎么能打印某种形式的值,比如3x2,也就是22

  1. Python究竟是如何对表进行排序的?我能倒排吗?

  2. 如何根据两列对其进行排序,例如第一个年龄,然后如果年龄是同一个b名称?

  3. 没有operator我怎么能做到?


Tags: thekey代码nameage排序createtable
3条回答

看起来你对那些东西有点困惑。

operator是一个内置模块,提供一组方便的运算符。简而言之,operator.itemgetter(n)构造一个可调用的,它假定一个iterable对象(例如list、tuple、set)作为输入,并从中获取第n个元素。

所以,不能在那里使用key=a[x][1],因为python不知道x是什么。相反,您可以使用lambda函数(elem只是一个变量名,没有魔力):

a.sort(key=lambda elem: elem[1])

或者只是一个普通函数:

def get_second_elem(iterable):
    return iterable[1]

a.sort(key=get_second_elem)

所以,这里有一个重要的注意事项:在python中,函数是first-class citizens,因此可以将它们作为参数传递给其他函数。

其他问题:

  1. 是的,您可以反向排序,只需添加reverse=Truea.sort(key=..., reverse=True)
  2. 若要按多个列排序,可以对多个索引使用itemgetter,或对lambda使用lambda elem: (elem[1], elem[2])。这样,就可以为列表中的每一个项动态地构造iterable,而这些项在词典学中是相互比较的顺序(比较的第一个元素,如果比较的是相等的第二个元素,等等)
  3. 可以使用a[2,1](索引是基于零的)在[3,2]处获取值。使用运算符。。。这是可能的,但不像索引那样干净。

有关详细信息,请参阅文档:

  1. ^{} explained
  2. Sorting list by custom key in Python

Python初学者的答案

简单地说:

  1. sortkey=参数需要一个key函数(应用于要排序的对象),而不是一个key
  2. 这正是operator.itemgetter(1)将给您的:一个函数从类列表对象中获取第一个项。

(更准确地说,它们是可调用的,而不是函数,但这是一个通常可以忽略的区别。)

你问了很多问题,你可以通过reading the documentation来回答自己,所以我会给你一个一般性的建议:阅读它并在python shell中进行实验。您将看到itemgetter返回一个可调用的:

>>> func = operator.itemgetter(1)
>>> func(a)
['Paul', 22, 'Car Dealer']
>>> func(a[0])
8

要以不同的方式执行此操作,可以使用lambda

a.sort(key=lambda x: x[1])

把它倒过来:

a.sort(key=operator.itemgetter(1), reverse=True)

按多个列排序:

a.sort(key=operator.itemgetter(1,2))

请参阅sorting How To

相关问题 更多 >

    热门问题