当前位置:   article > 正文

Python排序_python 排序

python 排序

Python排序

Python中有内置函数sorted(), list(列表)中也有函数list.sort()都可以进行排序。

区别

list.sort()是对已经存在的列表进行操作,进而可以改变进行操作的列表。而内建函数sorted可以对所有可迭代类型进行排序,返回的是一个新的list。

sorted函数

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)]

sort函数

如果对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)]
 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/55296
推荐阅读
相关标签
  

闽ICP备14008679号