- 对于
Python
内置函数sorted()
,先拿来跟list(列表)中的成员函数list.sort()
进行下对比。在本质上,list的排序和内建函数sorted的排序是差不多的,连参数都基本上是一样的。
主要的区别在于,list.sort()
是对已经存在的列表进行操作,进而可以改变进行操作的列表。而内建函数sorted
返回的是一个新的list,而不是在原来的基础上进行的操作. - 再来,让我们用
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, 所以会跟Python
2的有变差。
由帮助可以看到,传进去一个可迭代的数据,返回一个新的列表,注意,是新的列表!来看看看实例吧:
>>>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‘]
由以上可以看到,只要是可迭代对象数据,都能够进行排序,生成一个排序后的列表。
- 如果想要排逆序呢?很简单,只要将可选参数
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‘)
原文地址:https://www.cnblogs.com/yoyo008/p/10327745.html