我有以下代码:
# 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
等表格的特定值?
Python如何对表进行排序?我可以对它进行反向排序吗?
如何根据第一个年龄段的两列进行排序,然后如果年龄与b名称相同?
如果没有operator
我该怎么办?
答案 0 :(得分:82)
看起来你对这些东西感到有些困惑。
operator
是一个内置模块,提供一组方便的操作符。用两个词operator.itemgetter(n)
构造一个可调用的函数,它将一个可迭代的对象(例如list,tuple,set)作为输入,然后从中取出第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函数中是first-class citizens,所以你可以将它们作为参数传递给其他函数。
其他问题:
reverse=True
:a.sort(key=..., reverse=True)
itemgetter
与多个索引一起使用:operator.itemgetter(1,2)
或lambda:lambda elem: (elem[1], elem[2])
。这样,可以为列表中的每个项目动态构建迭代,然后以字典(?)顺序相互比较(比较第一个元素,如果相等,则比较第二个元素等)a[2,1]
在[3,2]处获取值(索引从零开始)。使用运算符......这是可能的,但不像索引一样干净。 有关详细信息,请参阅文档:
答案 1 :(得分:20)
简单来说:
key=
的{{1}}参数需要键函数(应用于要排序的对象)而不是单个键值和sort
将为您提供的:函数,它从类似列表的对象中抓取第一个项目。 (更准确地说,那些是 callables ,而不是函数,但这通常可以忽略不同。)
答案 2 :(得分:11)
你问的很多问题你可以通过reading the documentation自己回答,所以我会给你一个一般的建议:阅读它并在python shell中进行实验。你会看到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))
请参阅sorting How To。
答案 3 :(得分:0)
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']]
>>>
答案 4 :(得分:-1)
#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