LinuxEye - Linux系统教程

LinuxEye - Linux系统教程

当前位置: 主页 > 脚本编程 >

Python容器排序sort()与sorted()的区别与分析

时间:2013-06-17 21:42来源:wubiaoblog.com/archives/575 编辑:admin 点击:
Python容器排序通常使用的是sort()和sorted()方法,两者是有区别的。 先看下帮助文档: help(list.sort)Help on method_descriptor:sort(...) L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*; cmp(x, y)
Python容器排序通常使用的是sort()和sorted()方法,两者是有区别的。

先看下帮助文档:
>>> 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:待排序的可迭代类型的容器

看下两函数简单的用法(也是最本质的区别):
>>> 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

对于一个无序的列表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控制升序/降序。

转载请保留固定链接: https://linuxeye.com/program/1771.html

------分隔线----------------------------
标签:Pythonsort()sorted()
栏目列表
推荐内容