operator.itemgetter()和sort()如何工作?

发布于 2021-01-29 17:10:03

我有以下代码:

# 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]?可以吗
用运算符如何打印像3x2is这样的表格的某个值22

  1. Python到底如何对表格进行排序?我可以对它进行反向排序吗?

  2. 我如何基于两列(例如第一个年龄,然后如果年龄是相同的b名称)对其进行排序?

  3. 没有我怎么办operator

关注者
0
被浏览
43
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    看起来您对所有这些东西有些困惑。

    operator是一个内置的模块,提供了一组方便的操作员。用两个词operator.itemgetter(n)构造一个可调用对象,该对象假定一个可迭代对象(例如,列表,元组,集合)为输入,并从中获取第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函数是一等公民,因此您可以将它们作为参数传递给其他函数。

    其他问题:

    1. 是的,您可以反向排序,只需添加reverse=Truea.sort(key=..., reverse=True)
    2. 要按多个列进行排序,您可以将itemgetter多个index:operator.itemgetter(1,2)或lambda:一起使用lambda elem: (elem[1], elem[2])。这样,可迭代地为列表中的每个项目构造可迭代变量,然后按lexicographic(?)顺序将它们相互比较(比较第一个元素,如果相等,则比较第二个元素,依此类推)
    3. 您可以使用a[2,1][索引为0的索引]在[3,2]处获取值。使用运算符…可能,但是不像索引那样干净。

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

    1. operator.itemgetter 解释
    2. 在Python中按自定义键排序列表


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看