operator.itemgetter()和sort()如何工作?
我有以下代码:
# 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
is这样的表格的某个值22
?
-
Python到底如何对表格进行排序?我可以对它进行反向排序吗?
-
我如何基于两列(例如第一个年龄,然后如果年龄是相同的b名称)对其进行排序?
-
没有我怎么办
operator
?
-
看起来您对所有这些东西有些困惑。
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函数是一等公民,因此您可以将它们作为参数传递给其他函数。
其他问题:
- 是的,您可以反向排序,只需添加
reverse=True
:a.sort(key=..., reverse=True)
- 要按多个列进行排序,您可以将
itemgetter
多个index:operator.itemgetter(1,2)
或lambda:一起使用lambda elem: (elem[1], elem[2])
。这样,可迭代地为列表中的每个项目构造可迭代变量,然后按lexicographic(?)顺序将它们相互比较(比较第一个元素,如果相等,则比较第二个元素,依此类推) - 您可以使用
a[2,1]
[索引为0的索引]在[3,2]处获取值。使用运算符…可能,但是不像索引那样干净。
有关详细信息,请参阅文档:
- 是的,您可以反向排序,只需添加