我有以下代码:
# 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
?
Python究竟是如何对表进行排序的?我能倒排吗?
如何根据两列对其进行排序,例如第一个年龄,然后如果年龄是同一个b名称?
没有operator
我怎么能做到?
看起来你对那些东西有点困惑。
operator
是一个内置模块,提供一组方便的运算符。简而言之,operator.itemgetter(n)
构造一个可调用的,它假定一个iterable对象(例如list、tuple、set)作为输入,并从中获取第n个元素。所以,不能在那里使用
key=a[x][1]
,因为python不知道x
是什么。相反,您可以使用lambda
函数(elem
只是一个变量名,没有魔力):或者只是一个普通函数:
所以,这里有一个重要的注意事项:在python中,函数是first-class citizens,因此可以将它们作为参数传递给其他函数。
其他问题:
reverse=True
:a.sort(key=..., reverse=True)
itemgetter
,或对lambda使用lambda elem: (elem[1], elem[2])
。这样,就可以为列表中的每一个项动态地构造iterable,而这些项在词典学中是相互比较的顺序(比较的第一个元素,如果比较的是相等的第二个元素,等等)a[2,1]
(索引是基于零的)在[3,2]处获取值。使用运算符。。。这是可能的,但不像索引那样干净。有关详细信息,请参阅文档:
Python初学者的答案
简单地说:
sort
的key=
参数需要一个key函数(应用于要排序的对象),而不是一个key值和operator.itemgetter(1)
将给您的:一个函数从类列表对象中获取第一个项。(更准确地说,它们是可调用的,而不是函数,但这是一个通常可以忽略的区别。)
你问了很多问题,你可以通过reading the documentation来回答自己,所以我会给你一个一般性的建议:阅读它并在python shell中进行实验。您将看到
itemgetter
返回一个可调用的:要以不同的方式执行此操作,可以使用
lambda
:把它倒过来:
按多个列排序:
请参阅sorting How To。
相关问题 更多 >
编程相关推荐