zoukankan      html  css  js  c++  java
  • python sort和sorted

    转自 https://www.jianshu.com/p/419a8732ac62

    一、函数sort()


    1. sort() :仅对list对象进行排序,会改变list自身的顺序,没有返回值,即原地排序

    2. list.sort(key=None, reverse=False)

    • key :设置排序方法,或指定list中用于排序的元素;
    • reverse :升降序排列,默认为升序排列;
    1. 一维元素组成的list排序:忽略参数key
    >>> a = ['TaoBao', 'Google', 'BaiDu']
    >>> a.sort()
    >>> a
    ['BaiDu', 'Google', 'TaoBao']
    
    1. dict组成的list排序
    • 参数key获取dict的key或value值进行排序
    >>> a = [{'dell': 200}, {'mac': 100}]
    

    # 字典的value排序
    >>> a.sort(key=lambda x: list(x.values()))
    >>> a
    [{'mac': 100}, {'dell': 200}]

    # 字典的key排序
    >>> a.sort(key=lambda x: list(x.keys()))
    >>> a
    [{'dell': 200}, {'mac': 100}]

    • dict的长度排序
    >>> a = [{'mac': 200, 'huawei': 300, 'xiaomi': 150}, {'vivo': 210, 'Galaxy': 100}, {'Smartisan': 120, 'oppo': 200, 'lenovo': 50, 'meizu': 80}]
    >>> a.sort(key=lambda x: len(x))
    >>> a
    [{'vivo': 210, 'Galaxy': 100}, {'mac': 200, 'huawei': 300, 'xiaomi': 150}, {'Smartisan': 120, 'oppo': 200, 'lenovo': 50, 'meizu': 80}]
    
    1. 多维元素 组成的list排序
    • tuple的第2个元素排序
    >>> a = [('mac', 3, 'b'), ('linux', 2, 'a'), ('mac', 1, 'c')]
    >>> a
    [('mac', 3, 'b'), ('linux', 2, 'a'), ('mac', 1, 'c')]
    >>> a.sort(key=lambda x: x[1])    # lambda 函数:指定用于排序的元素
    >>> a
    [('mac', 1, 'c'), ('linux', 2, 'a'), ('mac', 3, 'b')]
    
    • tupel的第1个和3个元素进行排序
    >>> a.sort(key=lambda x: (x[0], x[2]))
    >>> a
    [('linux', 2, 'a'), ('mac', 3, 'b'), ('mac', 1, 'c')]
    


    二、sorted()


    1. sorted() :对所有可迭代对象进行排序,返回排序后的新对象,原对象保持不变;

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

    • key :设置排序方法,或指定迭代对象中,用于排序的元素;
    • reverse :升降序排列,默认为升序排列;
    1. 一维元素组成的迭代对象排序
    • dictkey/value排序:返回key/value排序后组成的list
    # key排序
    >>> a = {'Smartisan': 120, 'oppo': 200, 'lenovo': 50, 'meizu': 80}
    >>> sorted(a)
    ['Smartisan', 'lenovo', 'meizu', 'oppo']
    

    # value排序
    >>> a = {'Smartisan': 120, 'oppo': 200, 'lenovo': 50, 'meizu': 80}
    >>> sorted(a.values())
    [50, 80, 120, 200]

    • dictkey/value排序:返回排序后(key, value)组成的list
    # 按字典的value排序
    >>> a = {'Smartisan': 120, 'oppo': 200, 'lenovo': 50, 'meizu': 80}
    >>> sorted(a.items(), key=lambda x: x[1])
    [('lenovo', 50), ('meizu', 80), ('Smartisan', 120), ('oppo', 200)]
    
    • string排序:返回字符组成的list
    >>> a = 'python'
    >>> sorted(a)
    ['h', 'n', 'o', 'p', 't', 'y']
    
    • string分割排序
    >>> a = "This is a test string from Andrew"
    >>> sorted(a.split(), key=str.lower)    # split()函数进行字符串分割,key指定排序的方法
    ['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']
    
    1. 多维元素的排序
    • dict组成的tuplelist排序:方法类似sort()
    >>> a = ({'dell': 200}, {'mac': 100})
    >>> sorted(a, key=lambda x: list(x.values()))
    [{'mac': 100}, {'dell': 200}]
    
    • tuple组成的tuplelist排序:方法类似sort()
    >>> a = (('mac', 3, 'b'), ('linux', 2, 'a'), ('mac', 1, 'c'))
    >>> sorted(a, key=lambda x: (x[1], x[2]))    # 对tuple的第2、3个元素排序
    [('mac', 1, 'c'), ('linux', 2, 'a'), ('mac', 3, 'b')]
    
    • list组成的tuplelist排序:方法类似sort()
    >>> a = [[1, 5, 9], [8, 4, 3], [4, 6, 2]]
    >>> sorted(a, key=lambda x: x[0], reverse=True)    # 按第1个元素降序排列
    [[8, 4, 3], [4, 6, 2], [1, 5, 9]]
    


    三、sort()与sorted()的区别和联系


    1. sort():仅作用于list对象,没有返回值,修改对象本身;

    2. sorted():作用于所有可迭代对象,返回新的排序对象,不修改原对象;

    3. sort()函数不需要复制原有列表,消耗的内存较少,效率也较高;

    4. sorted()函数功能强大,使用的范围更为广泛。

    四、Operator模块函数

    1. Python提供了一些方便的函数,使得访问方法更加容易和快速;

    2. Operator模块是用C语言实现的,所以执行速度比python代码快;

    3. Operator模块有itemgetter、attrgetter、methodcaller等常用函数;

    4. 可以使用函数itemgetter()替代排序函数(sort、sorted)中key参数的lambda函数,更快速方便地获取元素;

    5. itemgetter():返回一个函数,通过该函数作用到目标对象上,获取目标对象对应位置上(index)的元素,即实现取元素的功能。

    >>> a = [1, 2, 100]
    >>> from operator import itemgetter
    

    # 获取位置为2的元素
    >>> f = itemgetter(2)
    >>> f
    operator.itemgetter(2)
    >>> f(a)
    100

    # 获取位置为1和2的元素
    >>> f = itemgetter(1, 2)
    >>> f
    operator.itemgetter(1, 2)
    >>> f(a)
    (2, 100)

    1. 抽象理解
      t为目标对象,f = itemgetter(n)
      调用 f(t) 时,返回t[n],即目标对象t中位置为n的元素

    2. 使用sort()sorted()排序时,可以使用itemgetter()替代key参数中的lambda函数。

    from operator import itemgetter
    

    >>> a = [('mac', 3, 'b'), ('linux', 2, 'a'), ('mac', 1, 'c')]

    >>> a.sort(key=itemgetter(1))
    >>> a
    [('mac', 1, 'c'), ('linux', 2, 'a'), ('mac', 3, 'b')]

    >>> sorted(a, key=itemgetter(2))
    [('linux', 2, 'a'), ('mac', 3, 'b'), ('mac', 1, 'c')]

  • 相关阅读:
    Java中Date日期字符串格式的各种转换
    Redis集群搭建与简单使用
    Java中的Redis应用
    java的linux命令
    Lucene全文检索引擎
    设置Xshell中支持中文
    Java并发Fork-Join框架原理解析
    java线程
    Django-路由层
    Django简介
  • 原文地址:https://www.cnblogs.com/lzping/p/12601039.html
Copyright © 2011-2022 走看看