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

时间:2013-09-03 15:08:56

标签: 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)

它创建一个4x3表,然后按年龄对其进行排序。我的问题是,key=operator.itemgetter(1)究竟是什么? operator.itemgetter函数是否返回项的值?为什么我不能在那里键入类似key=a[x][1]的内容?或者我可以吗?操作员如何打印3x2 22等表格的特定值?

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

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

  3. 如果没有operator我该怎么办?

5 个答案:

答案 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,所以你可以将它们作为参数传递给其他函数。

其他问题:

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

    1. operator.itemgetter explained
    2. Sorting list by custom key in Python

答案 1 :(得分:20)

Python初学者的答案

简单来说:

  1. key=的{​​{1}}参数需要键函数(应用于要排序的对象)而不是单个键
  2. 这正是sort将为您提供的:函数,它从类似列表的对象中抓取第一个项目。
  3. (更准确地说,那些是 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