zoukankan      html  css  js  c++  java
  • python基础——sorted()函数

     

    python基础——sorted()函数

    排序算法

      排序也是在程序中经常用到的算法。无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小。如果是数字,我们可以直接比较,但如果是字符串或者两个dict呢?直接比较数学上的大小是没有意义的,因此,比较的过程必须通过函数抽象出来。

      Python内置的sorted()函数就可以对list进行排序:

    >>> sorted([36, 5, -12, 9, -21])
    [-21, -12, 5, 9, 36]

      此外,sorted()函数也是一个高阶函数,它还可以接收一个key函数来实现自定义的排序,例如按绝对值大小排序:

    >>> sorted([36, 5, -12, 9, -21], key=abs)
    [5, 9, -12, -21, 36]

      key指定的函数将作用于list的每一个元素上,并根据key函数返回的结果进行排序。对比原始的list和经过key=abs处理过的list:

    list = [36, 5, -12, 9, -21]
    
    keys = [36, 5,  12, 9,  21]

      然后sorted()函数按照keys进行排序,并按照对应关系返回list相应的元素:

    keys排序结果 => [5, 9,  12,  21, 36]
                    |  |    |    |   |
    最终结果     => [5, 9, -12, -21, 36]

      我们再看一个字符串排序的例子:

    >>> sorted(['bob', 'about', 'Zoo', 'Credit'])
    ['Credit', 'Zoo', 'about', 'bob']

      默认情况下,对字符串排序,是按照ASCII的大小比较的,由于'Z' < 'a',结果,大写字母Z会排在小写字母a的前面。

      现在,我们提出排序应该忽略大小写,按照字母序排序。要实现这个算法,不必对现有代码大加改动,只要我们能用一个key函数把字符串映射为忽略大小写排序即可。忽略大小写来比较两个字符串,实际上就是先把字符串都变成大写(或者都变成小写),再比较。

      这样,我们给sorted传入key函数,即可实现忽略大小写的排序:

    >>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower)
    ['about', 'bob', 'Credit', 'Zoo']

      要进行反向排序,不必改动key函数,可以传入第三个参数reverse=True

    >>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)
    ['Zoo', 'Credit', 'bob', 'about']

      从上述例子可以看出,高阶函数的抽象能力是非常强大的,而且,核心代码可以保持得非常简洁。

     

    小结

      sorted()也是一个高阶函数。用sorted()排序的关键在于实现一个映射函数。

    练习

      假设我们用一组tuple表示学生名字和成绩:

    L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]

      请用sorted()对上述列表分别按名字排序:

    #练习:
    '''
    假设我们用一组tuple表示学生名字和成绩:
    L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
    1、请用sorted()对上述列表分别按名字排序:
    
    2、再按成绩从高到低排序:
    '''
    
    L=[('Bob',75),('Adam',92),('Bart',66),('Lisa',88)]
    #按名字排序
    def by_name(t):
        return t[0].lower()
    
    print('sorted by name: ')
    print(sorted(L,key=by_name))

      

      运行结果:

      

      再按成绩从高到低排序:

    #按成绩高低排序
    def by_score(t):
        return t[1]
    
    print('sorted by score: ')
    print(sorted(L,key=by_score,reverse=True))

      

      运行结果:

      

  • 相关阅读:
    HDU 2433 Travel (最短路,BFS,变形)
    HDU 2544 最短路 (最短路,spfa)
    HDU 2063 过山车 (最大匹配,匈牙利算法)
    HDU 1150 Machine Schedule (最小覆盖,匈牙利算法)
    290 Word Pattern 单词模式
    289 Game of Life 生命的游戏
    287 Find the Duplicate Number 寻找重复数
    283 Move Zeroes 移动零
    282 Expression Add Operators 给表达式添加运算符
    279 Perfect Squares 完美平方数
  • 原文地址:https://www.cnblogs.com/codingmengmeng/p/5808537.html
Copyright © 2011-2022 走看看