zoukankan      html  css  js  c++  java
  • Python中sorted()方法

    Python中sorted()方法的用法

    1.先说一下iterable,中文意思是迭代器。

    Python的帮助文档中对iterable的解释是:iteralbe指的是能够一次返回它的一个成员的对象。iterable主要包括3类:
    第一类是所有的序列类型,比如list(列表)、str(字符串)、tuple(元组)。
    第二类是一些非序列类型,比如dict(字典)、file(文件)。
    第三类是你定义的任何包含__iter__()或__getitem__()方法的类的对象。

    2.Python帮助文档中对sorted方法的讲解:

    sorted(iterable[,cmp,[,key[,reverse=True]]])
    作用:Return a new sorted list from the items in iterable.
    第一个参数是一个iterable,返回值是一个对iterable中元素进行排序后的列表(list)。
    可选的参数有三个,cmp、key和reverse。
    1)cmp指定一个定制的比较函数,这个函数接收两个参数(iterable的元素),如果第一个参数小于第二个参数,返回一个负数;如果第一个参数等于第二个参数,返回零;如果第一个参数大于第二个参数,返回一个正数。默认值为None。
    2)key指定一个接收一个参数的函数,这个函数用于从每个元素中提取一个用于比较的关键字。默认值为None。
    3)reverse是一个布尔值。如果设置为True,列表元素将被倒序排列。
    通常来说,key和reverse比一个等价的cmp函数处理速度要快。这是因为对于每个列表元素,cmp都会被调用多次,而key和reverse只被调用一次。

    3.具体的用法如下:

    1)排序基础

    一个简单的升序排列很简单-只需要调用sorted()函数即可。 这个函数返回一个新的排序列表。:
    >>> sorted([5,2,3,1,4])
    [1,2,3,4,5]
    你也可以使用list的list.sort()方法。这个方法会修改原始的list(返回值为None)。通常这个方法不如sorted()方便-如果你不需要原始的list,list.sort()方法效率会稍微高一些。
    >>> a=[5,2,3,1,4]
    >>> a.sort()
    >>> a
    [1,2,3,4,5]
    另一个区别在于list.sort()方法只为list定义。而sorted()函数可以接收任何的iterable。
    >>> sorted({1: 'D', 2: 'B', 3: 'B', 4: 'E', 5: 'A'}) [1, 2, 3, 4, 5]

    2)Key Functions(关键字函数)

    从Python2.4开始,list.sort()和sorted()方法都添加了一个key参数来说明一个函数,这个函数在做比较之前会对list中的每个元素进行调用。
    例如,这里是一个大小写不敏感的字符串比较:
    >>> sorted("This is a test string from Andrew".split(), key=str.lower) ['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']
    key的值应该是一个函数,这个函数接收一个参数并且返回一个用于比较的关键字。这种技术比较快,原因在于对每个输入记录,这个函数只会被调用一次。
    对复杂对象的比较通常是使用对象的切片作为关键字。例如:
    >>> student_tuples = [ ('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10), ]
    >>> sorted(student_tuples, key=lambda student: student[2]) # sort by age [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
    同样的技术适用于有named属性的对象。例如:
    >>> class Student: def init(self, name, grade, age):
    self.name = name
    self.grade = grade
    self.age = age
    def repr(self):
    return repr((self.name, self.grade, self.age))
    >>> student_objects = [Student('john', 'A', 15),Student('jane', 'B', 12),Student('dave', 'B', 10), ]
    >>> sorted(student_objects, key=lambda student: student.age) # sort by age [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

    3)Operator Module Functions (Operator模块中的函数)

    上面的key-function模式很常见,因此Python提供了方便的函数使得祖先函数更简单和快捷。operator module有itemgetter,attrgetter,以及从Python2.6开始的methodcaller函数。
    使用这些函数,上面的例子会变得更简单和快捷:
    >>> from operator import itemgetter, attrgetter
    >>> sorted(student_tuples, key=itemgetter(2)) [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
    >>> sorted(student_objects, key=attrgetter('age')) [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
    operator模块支持多级排序。例如先按成绩排序,再按年龄排序:
    >>> sorted(student_tuples, key=itemgetter(1,2)) [('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]
    >>> sorted(student_objects, key=attrgetter('grade', 'age')) [('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]

    4)升序和降序

    list.sort()和sorted()都接收一个reverse参数。它是用于降序排序的标志。例如,为了获得学生年龄的降序排序:
    >>> 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开始,排序都保证是稳定的。

      意思是当多个记录有相同的关键字时,它们原始的排序保留。
    >>> 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)之前。 这个好的特性能让你建立复杂的排序。例如,将学生记录按成绩降序排序、按年两升序排列。先按年龄排序,再按成绩排序。
    >>> s=sorted(student_object,key=attrgettter('age')) # sort on secondary key
    >>> sorted(s,key=attrgetter('grade'),reverse=True) [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

  • 相关阅读:
    Effective Java 19 Use interfaces only to define types
    Effective Java 18 Prefer interfaces to abstract classes
    Effective Java 17 Design and document for inheritance or else prohibit it
    Effective Java 16 Favor composition over inheritance
    Effective Java 15 Minimize mutability
    Effective Java 14 In public classes, use accessor methods, not public fields
    Effective Java 13 Minimize the accessibility of classes and members
    Effective Java 12 Consider implementing Comparable
    sencha touch SortableList 的使用
    sencha touch dataview 中添加 button 等复杂布局并添加监听事件
  • 原文地址:https://www.cnblogs.com/wspblog/p/5569630.html
Copyright © 2011-2022 走看看