zoukankan      html  css  js  c++  java
  • python中的sort、sorted、reverse、reversed详解

    python语言中的列表排序方法有三个:reverse反转/倒序排序、sort正序排序、sorted可以获取排序后的列表。在更高级列表排序中,后两中方法还可以加入条件参数进行排序。

    reverse()方法

    将列表中元素反转排序,比如下面这样

    1
    2
    3
    4
    >>> x = [1,5,2,3,4]
    >>> x.reverse()
    >>> x
    [4, 3, 2, 5, 1]

    reverse列表反转排序:是把原列表中的元素顺序从左至右的重新存放,而不会对列表中的参数进行排序整理。如果需要对列表中的参数进行整理,就需要用到列表的另一种排序方式sort正序排序。

    sort()排序方法

    此函数方法对列表内容进行正向排序,排序后的新列表会覆盖原列表(id不变),也就是sort排序方法是直接修改原列表list排序方法。

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

    许多python初学者,对sort()方法比较糊涂。有的时候会需要一个排序好的列表,而又想保存原有未排序列表,他们会这么操作:

    1
    2
    3
    4
    >>> a = [5,7,6,3,4,1,2]
    >>> b = a.sort()
    >>> print b
    None

    这个时候问题出现了,变量b得到的是一个空值。那么想要得到排序好的列表,又想保留原列表怎么办呢?列表sorted()方法可以帮你实现。

    sorted()方法

    即可以保留原列表,又能得到已经排序好的列表sorted()操作方法如下:

    1
    2
    3
    4
    5
    6
    >>> a = [5,7,6,3,4,1,2]
    >>> b = sorted(a)
    >>> a
    [5, 7, 6, 3, 4, 1, 2]
    >>> b
    [1, 2, 3, 4, 5, 6, 7]

    sorted()方法可以用在任何数据类型的序列中,返回的总是一个列表形式:

    1
    2
    >>> sorted('iplaypython.com')
    ['.''a''c''h''i''l''m''n''o''o''p''p''t''y''y']

    三者的区别

    sort()是可变对象(字典、列表)的方法,无参数,无返回值,sort()会改变可变对象,因此无需返回值。sort()方法是可变对象独有的方法或者属性,而作为不可变对象如元组、字符串是不具有这些方法的,如果调用将会返回一个异常。

    1
    2
    3
    4
    5
    >>> a=[5,4,3,2,1]
    >>> a.sort()
    >>> 
    >>> a
    [1, 2, 3, 4, 5]

     

    sorted()是python的内置函数,并不是可变对象(列表、字典)的特有方法,sorted()函数需要一个参数(参数可以是列表、字典、元组、字符串),无论传递什么参数,都将返回一个以列表为容器的返回值,如果是字典将返回键的列表。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> mystring="54321"
    >>> mytuple=(5,4,3,2,1)
    >>> mylist=[5,4,3,2,1]
    >>> sorted(mystring)
    ['1''2''3''4''5']
    >>> sorted(mytuple)
    [1, 2, 3, 4, 5]
    >>> sorted(mylist)
    [1, 2, 3, 4, 5]

     

    reverse()与sort的使用方式一样,而reversed()与sorted()的使用方式相同

    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> mylist=[5,4,3,2,1]
    >>> mylist.reverse()
    >>> mylist
    [1, 2, 3, 4, 5]
    >>> mylist=[5,4,3,2,1]
    >>> for in reversed(mylist):
    ...   print i,
    ... 
    1 2 3 4 5

     

    通过序列的切片也可以达到“逆转”的效果

    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> mystring="54321"
    >>> mytuple=(5,4,3,2,1)
    >>> mylist=[5,4,3,2,1]
    >>> mystring[::-1]
    '12345'
    >>> mytuple[::-1]
    (1, 2, 3, 4, 5)
    >>> mylist[::-1]
    [1, 2, 3, 4, 5]

     


    python 中 sorted() 和 list.sort() 的用法

    今天用python自带的sorted对一个列表进行排序, 在这里总结一下

    只要是可迭代对象都可以用sorted 。

    sorted(itrearble, cmp=None, key=None, reverse=False)

    =号后面是默认值 默认是升序排序的, 如果想让结果降序排列,用reverse=True

    最后会将排序的结果放到一个新的列表中, 而不是对iterable本身进行修改。

    eg:

    1, 简单排序

    sorted('123456')  字符串

    ['1', '2', '3', '4', '5', '6']

    sorted([1,4,5,2,3,6])  列表
    [1, 2, 3, 4, 5, 6]

    sorted({1:'q',3:'c',2:'g'}) 字典, 默认对字典的键进行排序
    [1, 2, 3]

     sorted({1:'q',3:'c',2:'g'}.keys())  对字典的键
    [1, 2, 3]

    sorted({1:'q',3:'c',2:'g'}.values())  对字典的值
    ['c', 'g', 'q']

    sorted({1:'q',3:'c',2:'g'}.items())  对键值对组成的元组的列表
    [(1, 'q'), (2, 'g'), (3, 'c')]

    2, 对元素指定的某一部分进行排序,关键字排序

    s = ['Chr1-10.txt','Chr1-1.txt','Chr1-2.txt','Chr1-14.txt','Chr1-3.txt','Chr1-20.txt','Chr1-5.txt']

    我想要按照-后的数字的大小升序排序。要用到key

    sorted(s, key=lambda d : int(d.split('-')[-1].split('.')[0]))

    ['Chr1-1.txt', 'Chr1-2.txt', 'Chr1-3.txt', 'Chr1-5.txt', 'Chr1-10.txt', 'Chr1-14.txt', 'Chr1-20.txt']

    这就是key的功能,制定排序的关键字,通常都是一个lambda函数,当然你也可以事先定义好这个函数。如果不讲这个关键字转化为整型,结果是这样的:

    sorted(s, key=lambda d : d.split('-')[-1].split('.')[0])

    ['Chr1-1.txt', 'Chr1-10.txt', 'Chr1-14.txt', 'Chr1-2.txt', 'Chr1-20.txt', 'Chr1-3.txt', 'Chr1-5.txt']

    这相当于把这个关键字当做字符串了,很显然,在python中,'2' > '10'

    你可以定制你想要的key, 如 key = lambda x : len(x) 按照序列的长度去排序。key= lambda x : (x[1], x[0]) 按二个元素,再第一个 等等。。。

     3,cmp不怎么用,因为key和reverse比单独一个cmp效率要高。

    如果进行降序排列,只需要加上reverse=True

     

    总结: sorted 和list.sort 都接受key, reverse定制。但是区别是。list.sort()是列表中的方法,只能用于列表。而sorted可以用于任何可迭代的对象。list.sort()是在原序列上进行修改,不会产生新的序列。所以如果你不需要旧的序列,可以选择list.sort()。 sorted() 会返回一个新的序列。旧的对象依然存在。

     

    如果你有一个字典,键是正负都有的只有一个小数点的数字字符串, 你想按数字从小到大排列键,首先把键列表转化为浮点型。对浮点型数据用sorted排序,然后再转化为只有一个小数点的数字字符串:

    for i in ['%.1f'%k for k in sorted(float(j) for j in fb_RA_11.keys())]:

     

     

    4)升序和降序

    list.sort()和sorted()都接受一个参数reverse(True or False)来表示升序或降序排序。例如对上面的student降序排序如下:

    复制代码 代码如下:

    >>> sorted(student_tuples, key=itemgetter(2), reverse=True)
    [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
    >>> sorted(student_objects, key=attrgetter('age'), reverse=True)
    [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]

    5)排序的稳定性和复杂排序

    从python2.2开始,排序被保证为稳定的。意思是说多个元素如果有相同的key,则排序前后他们的先后顺序不变。

    复制代码 代码如下:

    >>> data = [('red', 1), ('blue', 1), ('red', 2), ('blue', 2)]
    >>> sorted(data, key=itemgetter(0))
    [('blue', 1), ('blue', 2), ('red', 1), ('red', 2)]

    注意在排序后'blue'的顺序被保持了,即'blue', 1在'blue', 2的前面。
     
    更复杂地你可以构建多个步骤来进行更复杂的排序,例如对student数据先以grade降序排列,然后再以age升序排列。
    复制代码 代码如下:

    >>> s = sorted(student_objects, key=attrgetter('age'))     # sort on secondary key
    >>> sorted(s, key=attrgetter('grade'), reverse=True)       # now sort on primary key, descending
    [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]


    引用链接:

    http://www.cnblogs.com/qytang/p/5534452.html

    http://www.cnblogs.com/freemao/p/3869994.html

    http://www.jb51.net/article/57678.htm

    http://blog.csdn.net/ericxieforever/article/details/38925895

    http://www.qytang.com/
    http://www.qytang.com/cn/list/41/
    http://www.qytang.com/cn/list/37/
    http://www.qytang.com/cn/list/46/
    http://www.qytang.com/cn/page/19.htm
    http://www.qytang.com/cn/list/32/
    http://www.qytang.com/cn/list/28/
    http://www.qytang.com/cn/list/25/

  • 相关阅读:
    使用序列化实现对象的拷贝
    SQL连接查询深度探险
    关于ArrayList和Vector区别
    list_arrayList三种遍历性能比较
    Java过滤器与SpringMVC拦截器之间的关系与区别
    遍历map 哪种方式更加高效。
    Http请求中Content-Type讲解以及在Spring MVC中的应用
    sql语句练习50题
    在js中初始化select数据
    java浮点数剖析
  • 原文地址:https://www.cnblogs.com/june0507/p/7601016.html
Copyright © 2011-2022 走看看