【python进阶】sorted函数key用法。

python sorted & list.sort()

在python中,sorted和list.sort背后的算法是Timsort算法,它是一种自适应算法,会根据原始数据的顺序特点交替使用插入排序或者归并排序,已达到最佳效率。这样的算法被证明是很有效的,因为来自真实世界的数据通常是有一定的顺序特点的。Timsort在2002年的时候,首次用在CPython中。

key参数很妙

key参数是一个很棒的设计。能把事情变得简单高效。说它简单是因为只需要提供一个单参数函数来提取或者计算一个值作为比较大小的标准即可,在排序的时候,python会基于两个key,但是那一阶段的计算发生在C语言那一层,这样会比调用用户自定义的python比较函数更快。
因此用sorted函数效率更高。

用法举例

下面这个代码是对一副扑克牌进行排序。

import collections
from random import choice

Card = collections.namedtuple('Card', ['rank', 'suit'])   #定义类型card,有rank和card两种属性

class FrenchDeck:
    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]
beer_card = Card('7', 'diamond')
print(beer_card)
french = FrenchDeck()
print(french.cards)
print(len(french))
print(french[0])
print(french[-1])
print(choice(french))
print(choice(french))

#排序
suit_valus = dict(spades = 3, hearts = 2, diamonds = 1, clubs = 0)
def spades_high(card):   #排序函数,定义key,使得从低到高排序
    rank_value = french.ranks.index(card.rank)
    return rank_value * 4 + suit_valus[card.suit]
for card in sorted(french, key=spades_high):
    print(card)

扑克牌有两个属性,一个是rank,一个是花色(suits)。
首先自己定义init方法来初始化扑克牌
然后自己定义len方法来计算扑克牌的长度
然后自己定义getitem方法来返回下标,这样可以最大情况下避免重造轮子

定义了排序函数spades_high,根据扑克牌的rank和suit来确定返回的key,然后使用sorted进行排序,返回一个python的迭代器。

从结果中可以看到,扑克牌顺序输出。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值