Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 操作符.itemgetter()和sort()如何工作?_Python_Sorting_Operator Keyword - Fatal编程技术网

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

  • Python到底是如何对表进行排序的?我能反向排序吗

  • 如何根据两列对其进行排序,如first age,然后age是否为相同的b名称

  • 没有
    操作员
    ,我怎么做


  • 您提出了很多可以自己回答的问题,因此我将给您一个一般性建议:阅读它并在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]处的值(索引以零为基础)。使用运算符。。。这是可能的,但不像索引那样干净
  • 有关详细信息,请参阅文档:

  • Python初学者的答案 简而言之:

  • 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']]
    >>>