美文网首页
[转]Python容器排序sort()与sorted()的区别与

[转]Python容器排序sort()与sorted()的区别与

作者: everfight | 来源:发表于2016-10-13 11:33 被阅读938次

    先看下帮助文档:>>> help(list.sort)

    Help on method_descriptor:
    
    sort(...)
    L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;
    cmp(x, y) -> -1, 0, 1
    
    >>> help(sorted)
    Help on built-in function sorted in module __builtin__:
    
    sorted(...)
        sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list
    

    简单解释一下两函数:
    sort(cmp=None, key=None, reverse=False)
    sorted(iterable, cmp=None, key=None, reverse=False)

    sort是容器的函数,sorted是Python的内建函数相同的参数。

    cmp:用于比较的函数,比较什么由key决定,有默认值,迭代集合中的一项。cmp(e1, e2) 是带两个参数的比较函数, 返回值:
    负数: e1 < e2,
    0: e1 == e2,
    正数: e1 > e2。
    默认为 None, 即用内建的比较函数。

    key:用列表元素的某个已命名的属性或函数(只有一个参数并且返回一个用于排序的值)作为关键字,有默认值,迭代集合中的一项。

    reverse:排序规则,reverse = True 或者 reverse = False,有默认值。

    sorted多一个参数iterable:

    待排序的可迭代类型的容器看下两函数简单的用法(也是最本质的区别):

    >>> a=[1,3,5,2,9,4,7,8,6,0]
    >>> a.sort()
    >>> a
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> a=[1,3,5,2,9,4,7,8,6,0]
    >>> sorted(a)
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> a
    [1, 3, 5, 2, 9, 4, 7, 8, 6, 0]
    

    对于一个无序的列表a,调用a.sort(),对a进行排序后返回a。
    而对于同样一个无序的列表a,调用sorted(a),对a进行排序后返回一个新的列表,而对a不产生影响。

    接着看下两函数复杂点的用法:假设用一个tuple保存每一个员工的信息,包括工号,姓名,年龄。用一个list保存所有的员工信息。

    >>> list1=[(6,'cangjingkong',20),(4,'wutenglan',30),(7,'boduoyejiyi',25)]
    >>> list1.sort()
    >>> list1
    [(4, 'wutenglan', 30), (6, 'cangjingkong', 20), (7, 'boduoyejiyi', 25)]
    >>> list1=[(6,'cangjingkong',20),(4,'wutenglan',30),(7,'boduoyejiyi',25)]
    >>> sorted(list1)
    [(4, 'wutenglan', 30), (6, 'cangjingkong', 20), (7, 'boduoyejiyi', 25)]
    >>> list1
    [(6, 'cangjingkong', 20), (4, 'wutenglan', 30), (7, 'boduoyejiyi', 25)]
    

    当list由tuple组成时,默认情况下,sort和sorted都会根据tuplp[0]作为排序的key进行排序。当然,我们完全可以控制它的排序行为:
    1.基于key函数排序:

    >>> list1=[(6,'cangjingkong',20),(4,'wutenglan',30),(7,'boduoyejiyi',25)]
    >>> list1.sort(key=lambda employee : employee[2])
    >>> list1
    [(6, 'cangjingkong', 20), (7, 'boduoyejiyi', 25), (4, 'wutenglan', 30)]
    >>> list1=[(6,'cangjingkong',20),(4,'wutenglan',30),(7,'boduoyejiyi',25)]
    >>> sorted(list1,key=lambda employee : employee[2])
    [(6, 'cangjingkong', 20), (7, 'boduoyejiyi', 25), (4, 'wutenglan', 30)]
    >>> list1
    [(6, 'cangjingkong', 20), (4, 'wutenglan', 30), (7, 'boduoyejiyi', 25)]
    

    此时,list根据员工年龄排序。

    2.基于cmp函数排序:

    >>> list1=[(6,'cangjingkong',20),(4,'wutenglan',30),(7,'boduoyejiyi',25)]
    >>> list1.sort(cmp=lambda x,y : cmp(x[1],y[1]))
    >>> list1
    [(7, 'boduoyejiyi', 25), (6, 'cangjingkong', 20), (4, 'wutenglan', 30)]
    >>> list1=[(6,'cangjingkong',20),(4,'wutenglan',30),(7,'boduoyejiyi',25)]
    >>> sorted(list1,cmp=lambda x,y : cmp(x[1],y[1]))
    [(7, 'boduoyejiyi', 25), (6, 'cangjingkong', 20), (4, 'wutenglan', 30)]
    >>> list1
    [(6, 'cangjingkong', 20), (4, 'wutenglan', 30), (7, 'boduoyejiyi', 25)]
    

    此时,list根据员工姓名排序。

    3.基于升序/降序排序:

    >>> a=[1,3,5,2,9,4,7,8,6,0]
    >>> a.sort(reverse=False)
    >>> a
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> a.sort(reverse=Ture)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    NameError: name 'Ture' is not defined
    >>> a=[1,3,5,2,9,4,7,8,6,0]
    >>> a.sort(reverse=False)
    >>> a
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> a=[1,3,5,2,9,4,7,8,6,0]
    >>> a.sort(reverse=True)
    >>> a
    [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
    >>> a=[1,3,5,2,9,4,7,8,6,0]
    >>> sorted(a,reverse=False)
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> sorted(a,reverse=True)
    [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
    >>> a
    [1, 3, 5, 2, 9, 4, 7, 8, 6, 0]
    

    通过参数reverse控制升序/降序。

    相关文章

      网友评论

          本文标题:[转]Python容器排序sort()与sorted()的区别与

          本文链接:https://www.haomeiwen.com/subject/ddewyttx.html