赞
踩
Python中有内置函数sorted(), list(列表)中也有函数list.sort()都可以进行排序。
list.sort()是对已经存在的列表进行操作,进而可以改变进行操作的列表。而内建函数sorted可以对所有可迭代类型进行排序,返回的是一个新的list。
sorted可以对所有可迭代类型进行排序,并且返回新的已排序的列表。语法如下:
sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list
参数说明:
iterable:可迭代类型,例如字典、列表、
cmp:比较函数
key:可迭代类型中某个属性,对给定元素的每一项进行排序
reverse:降序或升序
来看看看实例吧:
ls1 = [3, 6, 1, 8, 2, 7, 9]
print(sorted(ls1))
ls2 = (6, 9, 1, 7, 3, 8, 2)
print(sorted(ls2))
print(sorted('fgjhtpor'))
由以上可以看到,只要是可迭代对象数据,都能够进行排序,生成一个排序后的列表。
如果想要排逆序呢?很简单,只要将可选参数reverse设置为True即可:
ls1 = [3, 6, 1, 8, 2, 7, 9]
print(sorted(ls1, reverse=True))
ls5 = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10),]
print(sorted(ls5, key=lambda stu : stu[2])) # sort by age
多维元素排序
有时候,我们要处理的数据内的元素不是一维的,而是二维的甚至是多维的,那要怎么进行排序呢?这时候,sorted()函数内的key参数就派上用场了! key参数可传入一个自定义函数。让我们看看如下代码:
ls4 = [('e', 3), ('b', 6), ('a', 1), ('g', 8), ('f', 2), ('c', 7), ('d', 9)]
print(sorted(ls4, key=lambda x:x[0]))
print(sorted(ls4, key=lambda x:x[1]))
print(sorted(ls4, key=lambda x:x[0], reverse=True))
print(sorted(ls4, key=lambda x:x[1], reverse=True))
这里,列表里面的每一个元素都为二维元组,key参数传入了一个lambda函数表达式,其x就代表列表里的每一个元素,然后分别利用索引返回元素内的第一个和第二个元素,这就代表了sorted()函数利用哪一个元素进行排列。而reverse参数就如同上面讲的一样,起到逆排的作用。默认情况下,reverse参数为False。
范例
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]
print(self._cards)
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):
print(card)
运行结果:
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')
比较函数用operator.itemgetter
operator模块提供的itemgetter函数用于获取对象的哪些维的数据,参数为一些序号。
要注意,operator.itemgetter函数获取的不是值,而是定义了一个函数,通过该函数作用到对象上才能获取值。
itemgetter可以用来当key的参数
例如根据第二个域和第三个域进行排序
import operator
a = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
sorted(students, key=operator.itemgetter(1,2))
运行结果:
[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]
对字典的值进行排序
dict={'a':1,'b':2}
result = sorted(dict.items(), key = lambda x:x[1], reverse = True)
print(result)
运行结果:
[('b', 2), ('a', 1)]
如果对python中的列表进行排序,可以使用List类的成员函数sort,该函数会在原空间上进行操作,对列表本身进行修改,不返回副本。语法如下:
L.sort(cmp=None, key=None, reverse=False)
比如:
ls6 = [('e', 3), ('b', 6), ('a', 1), ('g', 8), ('f', 2), ('c', 7), ('d', 9)]
ls6.sort(key=lambda x:x[0])
print(ls4)
ls7 = [3, 6, 1, 8, 2, 7, 9]
print(sorted(ls5))
运行结果:
[('e', 3), ('b', 6), ('a', 1), ('g', 8), ('f', 2), ('c', 7), ('d', 9)]
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。