首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >operator.itemgetter()和sort()是如何工作的?

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

Stack Overflow用户
提问于 2013-09-03 15:08:55
回答 6查看 252.1K关注 0票数 117

我有以下代码:

代码语言:javascript
复制
# 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]的内容呢?或者我可以?如何使用运算符打印表单的某个值,如3x2,即22

  1. Python是如何对表进行精确排序的?我能把它倒过来吗?
  2. 如何根据像第一年龄这样的两列对它进行排序,然后如果年龄是相同的b名呢?
  3. 没有operator我怎么能做到呢?
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-09-03 15:35:42

看来你对这些东西有点糊涂了。

operator是一个内置模块,提供了一组方便的操作人员.换句话说,operator.itemgetter(n)构造了一个可调用的函数,它将一个可迭代对象(例如列表、元组、集合)作为输入,并从其中提取第n个元素。

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

代码语言:javascript
复制
a.sort(key=lambda elem: elem[1])

或者只是一个普通的功能:

代码语言:javascript
复制
def get_second_elem(iterable):
    return iterable[1]

a.sort(key=get_second_elem)

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

其他问题:

  1. 是的,您可以反向排序,只需添加reverse=Truea.sort(key=..., reverse=True)
  2. 若要按多个列进行排序,可以将itemgetter与多个索引:operator.itemgetter(1,2)或lambda:lambda elem: (elem[1], elem[2])一起使用。这样,就可以动态地为列表中的每一项构造可迭代性,而在词典学(?)顺序(第一元素比较,如果相等,则比较第二元素,等等)
  3. 您可以使用a[2,1]获取3,2的值(索引是零的).使用操作员..。这是可能的,但不像索引那样干净。

详情请参阅文件:

  1. 解释
  2. 在Python中按自定义键对列表排序
票数 163
EN

Stack Overflow用户

发布于 2015-04-14 14:03:19

Python初学者的答案

用简单的话说:

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

(更准确地说,这些是可调用的,而不是函数,但这是一个经常被忽略的区别。)

票数 50
EN

Stack Overflow用户

发布于 2013-09-03 15:31:27

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

代码语言:javascript
复制
>>> func = operator.itemgetter(1)
>>> func(a)
['Paul', 22, 'Car Dealer']
>>> func(a[0])
8

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

代码语言:javascript
复制
a.sort(key=lambda x: x[1])

并将其逆转:

代码语言:javascript
复制
a.sort(key=operator.itemgetter(1), reverse=True)

按多列排序:

代码语言:javascript
复制
a.sort(key=operator.itemgetter(1,2))

分类如何

票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18595686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档