资讯专栏INFORMATION COLUMN

sorted函数

ixlei / 1828人阅读

摘要:一需要用到的函数需要用到的函数很少,基本上就是和。这个参数的默认值是恒等函数,也就是默认用元素自己的值来排序。后的函数会代入列表里的每一项返回一个优先级数字,并以这个优先级数字排序

一、需要用到的函数

需要用到的函数很少,基本上就是sorted()和lambda。

sorted()函数原型:

sorted(iterable[,key][,reverse])

可见sorted()可以接受3个参数,需要排序的变量必不可少,然后是key指定排序的元素,reverse指定是否逆序。

key:一个只有一个参数的函数,这个函数会被用在序列里的每一个元素上,所产生的结果将是排序算法依赖的对比关键字。比如说,在对一些字符串排序时,可以用key=len来实现根据字符串的长度进行排序。这个参数的默认值是恒等函数,也就是默认用元素自己的值来排序 (key=lambda x: x)。

lambda实际上就是匿名函数

一般形式:

lambda arguments: expression

写成函数形式就是

def (arguments):
    return expression

当lambda和sorted()的key参数结合就有意想不到的效果了。

二、各种排序

1.简单list排序

lis = ["a", "b", "c"]
print(sorted(lis))
# ["a", "b", "c"]
print(sorted(lis, reverse=True))
# ["c", "b", "a"]


2.dict的key排序

dic = {"c": 1, "b": 2, "a": 3} #字典排序默认按照字典的key排序,返回的也是字典的key
print(sorted(dic))
# ["a", "b", "c"]
print(sorted(dic, reverse=True))
# ["c", "b", "a"]


3.dict的value排序

dic = {"c": 1, "b": 2, "a": 3}
print(sorted(dic, key=lambda k: dic[k])) #dic([k])就是value
# ["c", "b", "a"]
print(sorted(dic, key=lambda k: dic[k], reverse=True))
# ["a", "b", "c"]


4.list内嵌套list排序

lis = [[4, 2, 9], [1, 5, 6], [7, 8, 3]]
print(sorted(lis, key=lambda k: k[0])) #列表内的没项代入key后的表达式,根据返回值排序
# [[1, 5, 6], [4, 2, 9], [7, 8, 3]]
print(sorted(lis, key=lambda k: k[1]))
# [[4, 2, 9], [1, 5, 6], [7, 8, 3]]
print(sorted(lis, key=lambda k: k[2]))
# [[7, 8, 3], [1, 5, 6], [4, 2, 9]]
print(sorted(lis, key=lambda k: k[0], reverse=True))
# [[7, 8, 3], [4, 2, 9], [1, 5, 6]]


5.dict内嵌套dict排序

dic = {
    "a": {"x": 3, "y": 2, "z": 1},
    "b": {"x": 2, "y": 1, "z": 3},
    "c": {"x": 1, "y": 3, "z": 2},
}
print(sorted(dic, key=lambda k: dic[k]["x"]))
# ["c", "b", "a"]
print(sorted(dic, key=lambda k: dic[k]["y"]))
# ["b", "a", "c"]
print(sorted(dic, key=lambda k: dic[k]["z"]))
# ["a", "c", "b"]
print(sorted(dic, key=lambda k: dic[k]["x"], reverse=True))
# ["a", "b", "c"]


6.list内嵌套dict排序

lis = [
    {"x": 3, "y": 2, "z": 1},
    {"x": 2, "y": 1, "z": 3},
    {"x": 1, "y": 3, "z": 2},
]
print(sorted(lis, key=lambda k: k["x"]))
# [{"z": 2, "x": 1, "y": 3}, {"z": 3, "x": 2, "y": 1}, {"z": 1, "x": 3, "y": 2}]
print(sorted(lis, key=lambda k: k["y"]))
# [{"z": 3, "x": 2, "y": 1}, {"z": 1, "x": 3, "y": 2}, {"z": 2, "x": 1, "y": 3}]
print(sorted(lis, key=lambda k: k["z"]))
# [{"z": 1, "x": 3, "y": 2}, {"z": 2, "x": 1, "y": 3}, {"z": 3, "x": 2, "y": 1}]
print(sorted(lis, key=lambda k: k["x"], reverse=True))
# [{"z": 1, "x": 3, "y": 2}, {"z": 3, "x": 2, "y": 1}, {"z": 2, "x": 1, "y": 3}]



7.dict内嵌套list排序

dic = {
    "a": [1, 2, 3],
    "b": [2, 1, 3],
    "c": [3, 1, 2],
}
print(sorted(dic, key=lambda k: dic[k][0]))
# ["a", "b", "c"]
print(sorted(dic, key=lambda k: dic[k][1]))
# ["b", "c", "a"]
print(sorted(dic, key=lambda k: dic[k][2]))
# ["c", "b", "a"]
print(sorted(dic, key=lambda k: dic[k][0], reverse=True))
# ["c", "b", "a"]

实例

1、给定一个只包含大小写字母,数字的字符串,对其进行排序,保证:

所有的小写字母在大写字母前面;
所有的字母在数字前面;
所有的奇数在偶数前面;

>>> s = "Sorting1234"
>>> "".join(sorted(s, key=lambda x: (x.isdigit(), x.isdigit() and int(x) % 2 == 0, x.isupper(), x.islower(), x)))
"ginortS1324"

2、排序一副FranchDeck。流畅的python书中示例

import collections

Card = collections.namedtuple("Card", ["rank", "suit"]) #命名元组

class FrenchDeck:
    ranks = [str(n) for n in range(2, 11)] + list("JQKA")  #2到10和JQKA
    suits = "spades diamonds clubs hearts".split()  #split默认按空格生成列表

    def __init__(self):
        self._cards = [Card(rank, suit) for suit in self.suits for rank in self.ranks] #生成所有52张牌

    def __len__(self):
        return len(self._cards)  #可以用Len()方法

    def __getitem__(self, position):
        return self._cards[position]  #可以用索引或切片

suit_values = dict(spades=3, hearts=2, diamonds=1, clubs=0) #设置花色优先级

def spades_high(card):
        rank_value = FrenchDeck.ranks.index(card.rank)  #找到当前Card所在的索引:2的索引为0
        return rank_value * len(suit_values) + suit_values[card.suit] #返回当前牌对应的优先级数字,如果没有乘于len(suit_values)那么("2", "spades")和("4", "diamonds")的优先级数字就一样了,这里也可以直接乘于4或5,6....
    
#排序
>>> import Frenchcard
>>> deck = Frenchcard.FrenchDeck()
>>> for i in sorted(deck, key=b.spades_high): #sorted返回一个列表。key后的函数会代入deck列表里的每一项返回一个优先级数字,并以这个优先级数字排序
...     print(i)
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")
.............


文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/43689.html

相关文章

  • 数组排序函数-php数组函数(一)

    摘要:下列的所有排序函数都是直接作用于数组本身,而不是返回一个新的有序的数组。倒序并保持索引关系,按键名排序按键名倒序使用用户自定义的比较函数对数组中的值进行排序,要排序的数组需要用一种不寻常的标准进行排序,那么应该使用此函数。 数组排序,共13个 函数中有u的,能自定义比较函数;有k的,按照键来排序;有r(reverse)的,倒序;有a(association)的,一定是键值关联,除了r...

    call_me_R 评论0 收藏0
  • 【重温基础】21.高阶函数

    摘要:欢迎您的支持系列目录复习资料资料整理个人整理重温基础篇重温基础对象介绍重温基础对象介绍重温基础介绍重温基础相等性判断重温基础闭包重温基础事件本章节复习的是中的高阶函数,可以提高我们的开发效率。 本文是 重温基础 系列文章的第二十一篇。 今日感受:想家。 本人自己整理的【Cute-JavaScript】资料,包含:【ES6/ES7/ES8/ES9】,【JavaScript基础...

    wua_wua2012 评论0 收藏0
  • 【重温基础】JS中的常用高阶函数介绍

    摘要:也可以直接调用内置方法常用高阶函数方法的作用是接收一个函数作为参数,对数组中每个元素按顺序调用一次传入的函数并返回结果,不改变原数组,返回一个新数组。 Ps. 晚上加班到快十点,回来赶紧整理整理这篇文章,今天老大给我推荐了一篇文章,我从写技术博客中收获到了什么?- J_Knight_,感受也是很多,自己也需要慢慢养成记录博客的习惯,即使起步艰难,难以坚持,但还是要让自己加油加油。 前...

    gitmilk 评论0 收藏0
  • 用sort实现orderby

    摘要:工作到了这个年数感觉那些基本函数语法已经跟人合一了根本不会为操作一些数据结构而思考半天了在做小程序的时候遇到了个的场景结果发现没有以为的那么简单也许是之前不求甚解的原因那么现在来解决的问题问题的产生与探讨方向在小程序中有个将的某一条置顶的需 工作到了这个年数, 感觉那些基本函数语法已经跟人合一了, 根本不会为操作一些数据结构而思考半天了. 在做小程序的时候遇到了个orderby的场景,...

    jiekechoo 评论0 收藏0
  • [译]正确使用 sort() 方法

    摘要:方法参数该有一个可选参数,允许此方法帮助对内容进行排序。例如,在非常大的数组中,可以使用新的方法来获得更有效的排序函数,而不是使用。在浏览器和节点中以全局对象的形式呈现,并具有广泛的支持包括。 英文原文: 《Usar correctamente el método sort()》 注意:内容有做精简和调整。 在过去的几个星期里,我们在不同的团队中看到,一般来说都没有使用 Array...

    dreambei 评论0 收藏0

发表评论

0条评论

ixlei

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<