zoukankan      html  css  js  c++  java
  • Python 内置函数sorted()在高级用法

     

    1. 对于Python内置函数sorted(),先拿来跟list(列表)中的成员函数list.sort()进行下对比。在本质上,list的排序和内建函数sorted的排序是差不多的,连参数都基本上是一样的。
      主要的区别在于,list.sort()是对已经存在的列表进行操作,进而可以改变进行操作的列表。而内建函数sorted返回的是一个新的list,而不是在原来的基础上进行的操作.

    2. 再来,让我们用Python自带的帮助函数help()看看对于sorted()是怎么定义的:

       >>>help(sorted)
      
       Help on built-in function sorted in module builtins:
       sorted(iterable, key=None, reverse=False)
           Return a new list containing all items from the iterable in ascending order.
      
           A custom key function can be supplied to customise the sort order, and the
           reverse flag can be set to request the result in descending order.

    要先说明的是, 本人用的Python版本为3.5, 所以会跟Python2的有变差。

    由帮助可以看到,传进去一个可迭代的数据,返回一个新的列表,注意,是新的列表!来看看看实例吧:

    >>>g=[1,4,6,8,9,3,5]
    >>>sorted(g)
    Out[30]: [1, 3, 4, 5, 6, 8, 9]
    
    >>>sorted((1,4,8,9,3,6))
    Out[33]: [1, 3, 4, 6, 8, 9]
    
    >>>sorted('gafrtp')
    Out[35]: ['a', 'f', 'g', 'p', 'r', 't']

    由以上可以看到,只要是可迭代对象数据,都能够进行排序,生成一个排序后的列表。

    1. 如果想要排逆序呢?很简单,只要将可选参数reverse设置为True即可:

       >>>sorted((1,4,8,9,3,6), reverse=True)
       Out[36]: [9, 8, 6, 4, 3, 1]

    高级用法

    有时候,我们要处理的数据内的元素不是一维的,而是二维的甚至是多维的,那要怎么进行排序呢?这时候,sorted()函数内的key参数就派上用场了!从帮助信息上可以了解到,key参数可传入一个自定义函数。那么,该如何使用呢?让我们看看如下代码:

    >>>l=[('a', 1), ('b', 2), ('c', 6), ('d', 4), ('e', 3)]
    >>>sorted(l, key=lambda x:x[0])
    Out[39]: [('a', 1), ('b', 2), ('c', 6), ('d', 4), ('e', 3)]
    >>>sorted(l, key=lambda x:x[0], reverse=True)
    Out[40]: [('e', 3), ('d', 4), ('c', 6), ('b', 2), ('a', 1)]
    >>>sorted(l, key=lambda x:x[1])
    Out[41]: [('a', 1), ('b', 2), ('e', 3), ('d', 4), ('c', 6)]
    >>>sorted(l, key=lambda x:x[1], reverse=True)
    Out[42]: [('c', 6), ('d', 4), ('e', 3), ('b', 2), ('a', 1)]

    这里,列表里面的每一个元素都为二维元组,key参数传入了一个lambda函数表达式,其x就代表列表里的每一个元素,然后分别利用索引返回元素内的第一个和第二个元素,这就代表了sorted()函数利用哪一个元素进行排列。而reverse参数就如同上面讲的一样,起到逆排的作用。默认情况下,reverse参数为False

    当然,正如一开始讲到的那样,如果想要对列表直接进行排序操作,可以用成员方法sort()来做:

    >>>l.sort(key=lambda x : x[1])
    >>>l
    Out[45]: [('a', 1), ('b', 2), ('e', 3), ('d', 4), ('c', 6)]
    >>>l.sort(key=lambda x : x[1], reverse=True)
    >>>l
    Out[47]: [('c', 6), ('d', 4), ('e', 3), ('b', 2), ('a', 1)]

    对于三维及以上的数据排排序,上述方法同样适用。

    应用:

    import collections

    Card = collections.namedtuple('Card', ['rank', 'suit'])


    class french_desk:
    ranks = [str(n) for n in range(2, 11)] + list('JQKA')
    suits = 'spades diamonds clubs hearts'.split()

    def __init__(self):
    self._cards = [Card(rank, suit) for suit in self.suits for rank in self.ranks]

    def __len__(self):
    return len(self._cards)

    def __getitem__(self, position):
    return self._cards[position]

    desk = french_desk()
    print(len(desk))
    print(desk[0])
    suit_values = dict(spades=3, hearts=2, diamonds=1, clubs=0)


    def spades_high(card):
    rank_value = french_desk.ranks.index(card.rank)
    return rank_value * len(suit_values) + suit_values[card.suit]

    for card in sorted(desk, key=spades_high): # spades_high入參為desk里的每个值 ,根据spades_high函数返回的值进行排序
    print(card)

    打印出排序后的desk:

    Card(rank='2', suit='spades')
    Card(rank='2', suit='clubs')
    Card(rank='2', suit='diamonds')
    Card(rank='2', suit='hearts')
    Card(rank='2', suit='spades')
    Card(rank='3', suit='clubs')
    Card(rank='3', suit='diamonds')
    Card(rank='3', suit='hearts')
    Card(rank='3', suit='spades')
    Card(rank='4', suit='clubs')
    Card(rank='4', suit='diamonds')
    Card(rank='4', suit='hearts')
    Card(rank='4', suit='spades')
    Card(rank='5', suit='clubs')
    Card(rank='5', suit='diamonds')
    Card(rank='5', suit='hearts')
    Card(rank='5', suit='spades')
    Card(rank='6', suit='clubs')
    Card(rank='6', suit='diamonds')
    Card(rank='6', suit='hearts')
    Card(rank='6', suit='spades')
    Card(rank='7', suit='clubs')
    Card(rank='7', suit='diamonds')
    Card(rank='7', suit='hearts')
    Card(rank='7', suit='spades')
    Card(rank='8', suit='clubs')
    Card(rank='8', suit='diamonds')
    Card(rank='8', suit='hearts')
    Card(rank='8', suit='spades')
    Card(rank='9', suit='clubs')
    Card(rank='9', suit='diamonds')
    Card(rank='9', suit='hearts')
    Card(rank='9', suit='spades')
    Card(rank='10', suit='clubs')
    Card(rank='10', suit='diamonds')
    Card(rank='10', suit='hearts')
    Card(rank='10', suit='spades')
    Card(rank='J', suit='clubs')
    Card(rank='J', suit='diamonds')
    Card(rank='J', suit='hearts')
    Card(rank='J', suit='spades')
    Card(rank='Q', suit='clubs')
    Card(rank='Q', suit='diamonds')
    Card(rank='Q', suit='hearts')
    Card(rank='Q', suit='spades')
    Card(rank='K', suit='clubs')
    Card(rank='K', suit='diamonds')
    Card(rank='K', suit='hearts')
    Card(rank='K', suit='spades')
    Card(rank='A', suit='clubs')
    Card(rank='A', suit='diamonds')
    Card(rank='A', suit='hearts')
    Card(rank='A', suit='spades')

  • 相关阅读:
    一个纯CSS下拉菜单
    【荐】DIV+CSS仿360buy京东商城导航条
    JS同一个页面布局滑动门和TAB
    很漂亮的蓝色CSS下拉菜单
    用JS已经封装好的滑动门,只需调用就可以用
    set row count
    html块元素与内联元素
    Div的内容自动换行(转载)
    xmlHTTP Status
    FF innerText(转载)
  • 原文地址:https://www.cnblogs.com/yoyo008/p/10327745.html
Copyright © 2011-2022 走看看