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

Nic*_*ckl 53 python sorting operator-keyword

我有以下代码:

# 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)
Run Code Online (Sandbox Code Playgroud)

它创建一个4x3表,然后按年龄对其进行排序.我的问题是,到底是key=operator.itemgetter(1)做什么的?该operator.itemgetter函数是否返回项目的值?为什么我不能只输入那样的东西key=a[x][1]?或者我可以吗?与运营商怎么能打印等形式的一定值3x222

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

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

  3. 我怎么能不这样做operator

J0H*_*0HN 92

看起来你对这些东西有点困惑.

operator是一个内置模块,提供一组方便的操作员.用两个词operator.itemgetter(n)构造一个可调用的函数,它将一个可迭代的对象(例如list,tuple,set)作为输入,并从中取出第n个元素.

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

a.sort(key=lambda elem: elem[1])
Run Code Online (Sandbox Code Playgroud)

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

def get_second_elem(iterable):
    return iterable[1]

a.sort(key=get_second_elem)
Run Code Online (Sandbox Code Playgroud)

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

其他问题:

  1. 是的,您可以反向排序,只需添加reverse=True: a.sort(key=..., reverse=True)
  2. 要按多个列排序,您可以使用itemgetter多个索引:operator.itemgetter(1,2)或使用lambda : lambda elem: (elem[1], elem[2]). 通过这种方式,可以为列表中的每个项目动态构建迭代,然后以字典(?)顺序相互比较(比较第一个元素,如果相等,则比较第二个元素等)
  3. 您可以使用a[2,1](索引从零开始)在[3,2]处获取值.使用运算符......这是可能的,但不像索引一样干净.

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

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

  • 您将如何按一列反向排序而不被另一列反向排序? (2认同)
  • @Vim [根据文档](https://docs.python.org/2/library/operator.html#operator.itemgetter),对于 dict 它应该适用于任何可哈希值。`itemgetter(n)` 意味着它将尝试执行 dict.__getitem__ 查找,这(除非您实际上没有使用 dict,而是扩展 dict 并覆盖 __getitem__ 的自定义类)相当于 `dict[n]` -如果字典中没有“n”键,它显然会失败。对于不确定键是否存在的字典,您可能需要坚持使用“lambda key: dict.get(key, None)”或类似的内容。示例:https://ideone.com/PJk8vd (2认同)

Lut*_*elt 25

Python初学者的答案

用简单的话说:

  1. 所述key=的参数sort需要密钥函数(要施加到要进行排序的对象),而不是单个密钥
  2. 这正是operator.itemgetter(1)会给你:一个功能是从列表状物体抓住的第一个项目.

(更准确地说,这些是可调用的,而不是功能,但这是一个经常可以忽略的差异.)

  • @Locane:不,那不是正在发生的事情.`attrgetter`将为你构造一个合适的函数并返回它.它_is_发送"结果".只有那个结果才是一个功能. (3认同)

Pau*_*ida 11

你正在通过阅读文档问自己可以回答的很多问题,所以我会给你一个一般的建议:阅读它并在python shell中进行实验.你会看到itemgetter返回一个可调用的:

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

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

a.sort(key=lambda x: x[1])
Run Code Online (Sandbox Code Playgroud)

并扭转它:

a.sort(key=operator.itemgetter(1), reverse=True)
Run Code Online (Sandbox Code Playgroud)

按多列排序:

a.sort(key=operator.itemgetter(1,2))
Run Code Online (Sandbox Code Playgroud)

请参阅排序方法.