zoukankan      html  css  js  c++  java
  • python学习笔记5:排序

    1. list内置方法sort()

    语法:sort(key=None, reverse=False)

    参数:
    key,一个函数,作用是指定比较的元素, 通常由lambda指定, 可以指定多个值lambda x: (x[0], x[1], x[2]);
    reverse,bool类型,False升序,True降序, 默认升序;

    说明:
    sort方法会改变list本身, 并返回None, 所以不能这么写a = b.sort();
    python3中,sort删除了cmp参数

    例子:

    >>> L0 = [('a', 1), ('b', 3), ('d', 2), ('c', 1)]  
    >>>   
    >>> # 默认排序  
    >>> L0.sort()  
    >>> L0  
    [('a', 1), ('b', 3), ('c', 1), ('d', 2)]  
    >>>   
    >>> # key=lambda x:x[1], 按L0元素(是一个tuple)的第1个元素排序,  
    >>> # 也可以指定key=lambda x:(x[1], x[0])进行多维排序  
    >>> L0.sort(key=lambda x:x[1])  
    >>> L0  
    [('a', 1), ('c', 1), ('d', 2), ('b', 3)]  
    >>>   
    >>> # 降序排序  
    >>> L0.sort(reverse=True) # 默认按升序排序,通过reverse=True按降序排列;  
    >>> L0  
    [('d', 2), ('c', 1), ('b', 3), ('a', 1)]  
    >>>   
    >>> # sort返回值是None, 即list.sort()没返回任何对象  
    >>> print(L0.sort())  
    None  
    

    2. 全局方法sorted()

    语法:sorted(iterable, key=None, reverse=False)
    参数:
    iterable: 可迭代对象
    key:sorted是一个高阶函数,可以接收一个key函数来自定义排序,key指定的函数作用于list的每一个元素上,并根据key函数的返回值进行排序, 参见list的内置函数sort的key参数.
    reverser:bool类型,False升序,True降序; 默认升序.

    注意:sorted方法不改变原序列,而是返回一个新的序列;

    例1:按绝对值排序、按忽略大小写排序、降序排序

    >>> sorted([36,15,-12,9,-21], key=abs) #按绝对值大小排序;  
    [9, -12, 15, -21, 36]  
    >>> sorted(['bob', 'About', 'Zoo', 'Credit'], key=str.lower) # 按忽略大小写排序;  
    ['About', 'bob', 'Credit', 'Zoo']  
    >>> sorted(['bob','About','Zoo','Credit'], key = str.lower, reverse=True) # 按忽略大小写反向排序;  
    ['Zoo', 'Credit', 'bob', 'About']   
    

    例2:按字典的key/value排序

    >>> d={}  
    >>> d['a'] = 3  
    >>> d['b'] = 4  
    >>> d['c'] = 2  
    >>> d['d'] = 1  
    >>> sorted(d.items(), key=lambda x:x[0]) #按key排序,返回[('a',3),('b',4),('c',2),('d',1)]  
    >>> sorted(d.items(), key=lambda x:x[1]) #按value排序,返回[('d',1),('c',2),('a',3),('b',4)]  
    

    例3:按多条件排序

    >>> d0 = {}  
    >>> d0['id0'] = {'score':90, 'name':'name1', 'age':14}  
    >>> d0['id1'] = {'score':90, 'name':'name3', 'age':12}  
    >>> d0['id2'] = {'score':60, 'name':'name2', 'age':13}  
    >>> d0['id3'] = {'score':90, 'name':'name3', 'age':11}  
    >>>  
    >>> list_id_sorted = sorted(  
    ...     d0.keys(),  # 对d0.keys()排序, 所以返回的是id组成的list.
    ...     key=lambda s_id:(  
    ...         -d0[s_id]['score'], # 按分数逆序排列,-表示逆序  
    ...         d0[s_id]['name']  , # 按姓名顺序排列  
    ...         s_id              , # 按学号顺序排列  
    ...     )  
    ... )  
    ...  
    >>> for s_id in list_id_sorted:  
    ...     print(f'{d0[s_id]['score']} {d0[s_id]['name']} {s_id}')  
    ...  
    90 name1 id0 # 90分排在前;  
    90 name3 id1 # 同样90分,按姓名排序;  
    90 name3 id3 # 同样90分,同样name3,按学号排序;  
    60 name2 id2 # 60分排在后;  
    

    3. key参数

    key参数
    可以是一个简单的函数, 比如key=str或key=str.lower,
    可以是一个通过lambda指定的函数 key=lambda x:(x[0], x[1])
    可以是一个自定义的函数:

    def sort_str(x):  
      m = re.match(r'^(S+?)(d+)$', x)  
      if m:  
         _name = m.group(1)  
         _idx = int(m.group(2))  
      else:  
        _name = x  
        _idx = 0  
      return _name, idx # 先按前导字符排序, 后按后缀数字排序  
                        # 这样'a2'排在'a10'前面, 'a*'排在'b0'前面.  
      
    L0 = ['a2', 'b3', 'a1', 'b20', 'a0', 'a10', 'a9', 'b0']  
    L1 = sorted(L0, key=sort_str)   
    print(L1) # ['a0', 'a1', 'a2', 'a9', 'a10', 'b0', 'b3', 'b20']  
    
  • 相关阅读:
    Autodesk Infrastructure Map Server(AIMS)/MapGuide API 培训材料第6章
    安装Vault Professional Server的一些问题
    Autodesk Infrastructure Map Server(AIMS)/MapGuide API 培训材料第2章
    C++的构造函数和析构函数
    一些常用的字符串hash函数
    类的operator new与operator delete的重载
    计算字符串的相似度(编辑距离)
    C++的重载(overload)与重写(override)
    穷举法解24点游戏
    C语言字符串库函数的实现
  • 原文地址:https://www.cnblogs.com/gaiqingfeng/p/13228963.html
Copyright © 2011-2022 走看看