美文网首页
Sorting How To

Sorting How To

作者: 赌气的对白 | 来源:发表于2015-09-24 23:56 被阅读42次

注:参考官方文档,对How to系列的总结,方便自己以后回顾,建议读者看官方文档,讲的很容易理解。


Sorting Basics

基本的排序有两种: sorted(list) 、list.sort( ),默认是升序

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

区别1:list.sort()会改变原有list , sorted()会返回一个新的list,原有list不变。
区别2:list.sort()只能用于list,而sorted()可用于任何可迭代的对象。
官方解释:Python lists have a built-in list.sort() method that modifies the list in-place. There is also a sorted() built-in function that builds a new sorted list from an iterable.
为了方便记忆,可以把list.sort()记为是list的一个函数,调用改变自身;而sorted是一个类似外部排序函数的性质。(仅仅方便记忆,这样描述不准确)


Key Functions

从python 2.4开始,可以为list.sort() and sorted()加上一个key参数作为排序的规则。
下面是一个例子,将字符串中的单词按照小写字母顺序排序。

>>> 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)]

根据对象属性排序:

>>> 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)]

Operator Module Functions

使用 operator.itemgetter(),operator.attrgetter()以及Python 2.5 之后的operator.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.methodcaller()函数,使用方法固定的参数要求对每个对象进行排序。例如,str.count()方法可用于通过计数在消息的惊叹号的数目来计算消息优先级:

>>> messages = ['critical!!!', 'hurry!', 'standby', 'immediate!!']
>>> sorted(messages, key=methodcaller('count', '!'))
['standby', 'hurry!', 'immediate!!', 'critical!!!']

Ascending and Descending

list.sort()和sorted()可以通过一个boolean参数来进行升序/降序切换

>>> 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)]

从Python2.2开始,排序都保证是稳定的。意思是当多个记录有相同的关键字时,它们原始的排序保留:

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

这个好的特性能让你建立复杂的排序。例如,将学生记录按成绩降序排序、按年两升序排列。先按年龄排序,再按成绩排序。

>>> 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)]

相关文章

  • Sorting How To

    注:参考官方文档,对How to系列的总结,方便自己以后回顾,建议读者看官方文档,讲的很容易理解。 Sorting...

  • Basic Algorithm

    Sorting Algorithm Setup and Driver Program Each sorting a...

  • Harry Potter and The Sorcerer's

    Chapter 7 The Sorting Hat Sorting was a very important ce...

  • Comparable vs Comparator

    sorting 排序 sorting-in-javaJava中提供了Arrays.sort()和Collectio...

  • Sorting

    本文是我正在写的gitbook上的书Algorithms一个章节,由于是记录课程的内容,所以下文都是英文,见谅。 ...

  • Sorting

    排序与相关性 1、排序默认是根据相关性_score进行降序排序。filter会导致_score为0,如果0分对我们...

  • Sorting

    排序是算法里面一个老生常态的内容,基本是所有算法的第一关。 插入排序 算法思路 最简单的排序莫过于插入排序,需要N...

  • 拓扑排序(Topological Sorting)

    拓扑排序(Topological Sorting)拓扑排序(Topological Sorting)是一个有向无环...

  • Sorting Group 在运行时添加子对象 order 不太

    2017年5月20日 unity 5.6 增加的 Sorting Group. 问题描述:Sorting Grou...

  • Princeton Alogorithm COS226 Week

    Alphabets review: summary of the performance of sorting a...

网友评论

      本文标题:Sorting How To

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