Python 操作符.itemgetter()和sort()如何工作?
我有以下代码:Python 操作符.itemgetter()和sort()如何工作?,python,sorting,operator-keyword,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&
# 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)
到底做什么?操作符.itemgetter
函数是否返回项的值?为什么我不能在那里键入类似于key=a[x][1]
的内容?或者我可以吗?操作员如何打印表单的某个值,如3x2
,即22
操作员
,我怎么做
您提出了很多可以自己回答的问题,因此我将给您一个一般性建议:阅读它并在pythonshell中进行实验。您将看到
itemgetter
返回一个可调用的:
>>> func = operator.itemgetter(1)
>>> func(a)
['Paul', 22, 'Car Dealer']
>>> func(a[0])
8
要以不同的方式执行,可以使用lambda
:
a.sort(key=lambda x: x[1])
反过来说:
a.sort(key=operator.itemgetter(1), reverse=True)
按多个列排序:
a.sort(key=operator.itemgetter(1,2))
请参阅。看起来您对这些东西有点困惑
操作员
是一个内置模块,提供一组方便的操作员。换句话说,operator.itemgetter(n)构造一个可调用对象,该对象假定一个iterable对象(例如list、tuple、set)作为输入,并从中提取第n个元素
因此,这里不能使用key=a[x][1]
,因为python不知道x
是什么。相反,您可以使用lambda
函数(elem
只是一个变量名,没有魔力):
或者只是一个普通函数:
def get_second_elem(iterable):
return iterable[1]
a.sort(key=get_second_elem)
所以,这里有一个重要的注意事项:在python中,函数是,所以您可以将它们作为参数传递给其他函数
其他问题:
reverse=True
:a.sort(key=…,reverse=True)
itemgetter
与多个索引一起使用:operator.itemgetter(1,2)
,或与lambda一起使用:lambda elem:
。通过这种方式,列表中的每一项都可以动态地构造一个可比表,然后按照词典(?)顺序相互比较(比较第一个元素,如果相等,则比较第二个元素,等等)a[2,1]
获取[3,2]处的值(索引以零为基础)。使用运算符。。。这是可能的,但不像索引那样干净sort
的key=
参数需要一个键函数(应用于要排序的对象),而不是单个键值和operator.itemgetter(1)
将提供的功能:从类似列表的对象中获取第一项李>
(更确切地说,这些是可调用的,不是函数,但这是一个经常被忽略的区别。)a=[]
a、 附加([“尼克”,30,“医生])
a、 附加([“约翰”,8,“学生])
a、 附加([“保罗”,8,“汽车经销商])
a、 追加([“马克”,66,“退休”])
打印
[尼克,30岁,医生,[约翰,8岁,学生,[保罗,8岁,汽车经销商],[马克,66岁,退休]]
def_cmp(a、b):
如果a[1]b[1]:
返回1
其他:
返回0
已排序(a,cmp=\U cmp)
约翰,8岁,学生,保罗,8岁,汽车经销商,尼克,30岁,医生,马克,66岁,退休
定义键(列表元素):
返回列表_ele[1]
已排序(a,键=_键)
约翰,8岁,学生,保罗,8岁,汽车经销商,尼克,30岁,医生,马克,66岁,退休
>>>
此解决方案不使用运算符。如果n
是一个有效键,而不是您提出的某个int
,则itemgetter(n)似乎不适用于set
或dict
(如果n
是一个有效键,则它可能适用于dict
)@Vim,对于dict,它应该与任何可散列值一起工作itemgetter(n)
意味着它将尝试执行dict.\uuu getitem\uuuu查找,这(除非您实际使用的不是dict,而是扩展dict并重写getitem的自定义类)相当于dict[n]
-如果dict中没有n
键,则显然会失败。对于不确定是否存在键的dict,您可能希望使用类似lambda key:dict.get(key,None)
或类似的方法。示例:@yayitswei如果一列是一个数字,则使用lambda行:(row.one\u thing,-row.number\u thing)
,提供reverse=True
如果您想通过one\u thing
进行反向操作。如果你没有这样一个简单的数字选项,你就得再弄点花样了。@yahyitswi是的,请在这里查看itemgetter排序解决方案以改变多列的反向参数,然后你需要将排序按多个步骤排成一行:谢谢-作为一个仍在学习的python程序员,这就是我想要了解发生了什么的原因。我不清楚代码中的“.sort(key=attrgetter(“index”))”是否将带有参数“index”的函数attrgetter()发送给sort()函数;我还以为它发送的结果和C语言和其他语言一样。@Locane:不,事情不是这样的attrgetter
将为您构造一个合适的函数并返回它。它正在发送一个“结果”。只有那个结果是一个函数。与此帖子相关
def get_second_elem(iterable):
return iterable[1]
a.sort(key=get_second_elem)
#sorting first by age then profession,you can change it in function "fun".
a = []
def fun(v):
return (v[1],v[2])
# create the table (name, age, job)
a.append(["Nick", 30, "Doctor"])
a.append(["John", 8, "Student"])
a.append(["Paul", 8,"Car Dealer"])
a.append(["Mark", 66, "Retired"])
a.sort(key=fun)
print a
a = []
a.append(["Nick", 30, "Doctor"])
a.append(["John", 8, "Student"])
a.append(["Paul", 8,"Car Dealer"])
a.append(["Mark", 66, "Retired"])
print a
[['Nick', 30, 'Doctor'], ['John', 8, 'Student'], ['Paul', 8, 'Car Dealer'], ['Mark', 66, 'Retired']]
def _cmp(a,b):
if a[1]<b[1]:
return -1
elif a[1]>b[1]:
return 1
else:
return 0
sorted(a,cmp=_cmp)
[['John', 8, 'Student'], ['Paul', 8, 'Car Dealer'], ['Nick', 30, 'Doctor'], ['Mark', 66, 'Retired']]
def _key(list_ele):
return list_ele[1]
sorted(a,key=_key)
[['John', 8, 'Student'], ['Paul', 8, 'Car Dealer'], ['Nick', 30, 'Doctor'], ['Mark', 66, 'Retired']]
>>>