Python:sorted排序+key扩展使用

(1)内置排序函数

(2)reversed操作

(3)扩展用法key

当我们要对一串数字或者字母,进行大小比较排序时,如果少数个我们可以自行排序,但是当数字多达几十个,甚至几百个时,人为排序就会使得效率低下,甚至有可能出错。内置函数sorted()就解决了这一问题。

内置排序函数

  • sorted():是标准内置排序函数,按 < 关系排序。可用于所有序列或迭代器,该函数返回一个元素已排好的,其中包含作为参数的序列或迭代器的所有元素。调用为表排序时,构造出的是另一个排好序的表,并不是在原列表上操作。
  • list.sort():是表类型独有的操作,其功能与标准函数sorted()类似,但实际效果不同,sort()是在自身表里完成对元素的排序,并没有构造出新表。

实例解释:

#为表排序
>>>lst = [5, 3, 7, 0]
>>>print(sorted(lst))
[0, 3, 5, 7]    #输出排好序的新表

#为元组排序
>>>tup = (5, 3, 7, 0)
>>>print(sorted(tup))
[0, 3, 5, 7]    #同样输出排好序的表

#为字典排序
>>>dic = {'s':0, 'a':7}
>>>print(sorted(dic))
['a', 's']      #输出字典关键字的表,字母根据ASICC码进行排序,单词根据首字母以此往后比较

#表的sort()使用
>>>lst = [5, 3, 7, 0]
>>>lst.sort()   #lst.sort()是对列表的操作,直接调用print(lst.sort()),返回None
>>>print(lst)
[5, 3, 7, 0]    #调用print(lst)输出

注意:

  • 当一个迭代对象中既包含字母,又包含数字时,无法进行排序,解释器报错。
    TypeError: '<' not supported between instances of 'int' and 'str'。
    
  • 对非列表对象调用sort,报AttributeError。
    #例如元组
    >>>tup = (3,5)
    >>>tup.sort()
    AttributeError: 'tuple' object has no attribute 'sort'
    

reversed操作

  • reversed():标准的序列反转函数,可用于各种对象(不包括迭代器)。返回的是对象的一个反向迭代器,原对象并不改变。作为循环变量时,将按照原对象从后往前的顺序逐个得到元素。同时,reversed()只能用于变动序列
  • list.reverse():其功能与标准函数reversed()类似,但实际上也是调整了list中元素的位置。

实例解释:

#反转列表
>>>lst = [5, 3, 7, 0]
>>>print(reversed(lst))

##返回的是一个迭代器
>>>for i in reversed(lst):
       print(i)
0
7
3
5      
 ####其他序列情况类似,再次不一一展示

#使用reverse()进行反转
>>>print(lst.reverse())
None    #类似于sort(),因为是操作,直接输出返回None
>>>lst.reverse()
>>>print(lst)
[0, 7, 3, 5]

#reverse + sort 使用
>>>lst.sort(reverse = True)   #此时为 > 关系排序,默认为False
>>>print(lst)
[7, 5, 3, 0]

插在中间的小结:

  1. sorted 和 reversed 可以用于任何序列对象
  2. reverse操作只能用于可变序列对象
  3. sort操作只能用于表对象

扩展用法key

Python2.4之后,list.sort() 和 sorted() 都增加了 key 关键字参数用来进行在指定位置上的比较。

实例解释:

#二元组(k,v)关于v的 < 关系进行排序,再根据 k 的 > 关系进行排序
>>>s = [(3, 7), (5,0), (9,7), (4,1)]
>>>print(sorted(s, key = lambda x : (x[1], -x[0])))
[(5, 0), (4, 1), (9, 7), (3, 7)]

调用key的时候我们定义了一个lambda函数,他的使用过程是:

  1. 获取s中的一个元组作为实参调用
  2. x[1]表示改元组中下标为1的元素,即v
  3. x[0]类似,表示元组中小标为0的元素,即k
  4. 负号 - 表示按 > 关系排序
  5. x[1], -x[0] 的位置关系表示先将s中的所有元组按x[1]的 < 关系排序,再按x[0]的 > 关系排序

字典可以调用dic.item()转换成二元组使用,类似的三元组等都可以通过关键字key按指定位置上的元素排序。

你可能感兴趣的:(python,key,sorted/sort,排序)