首页 > 技术文章 > python的常见排序

wutongyuhou 2014-02-26 11:36 原文

在python程序中,我们往往自始至终都在与序列(列表、字典、元组)打交道,而最常用的操作就是对序列排序了。在此简单总结一下python中的排序。 

  • 基本排序方法

在python中,list对象具有 sort( ) 方法,该方法对list中的元素重拍,修改list本身。同时,python中还有一个 sorted( ) 函数,可以对任意的Iterator(关于Iterator的介绍请看这里)排序,该函数构建一个新的list来返回排序结果,不修改Iterator本身。

最简单的,我们可以直接调用sorted函数,递增排序,注意,sorted( ) 函数返回一个新的list

>>> sorted([5, 2, 3, 1, 4])
[1, 2, 3, 4, 5]

对于list对象,可以直接调用它的 sort( ) 方法,该方法直接修改list本身(返回None)。

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

一般情况下,我们使用 sorted( ) 函数,因为它可以作用于任何Iterator,并且不修改Iterator本身。

>>> sorted({2: 'D', 1: 'B', 3: 'B', 4: 'E', 5: 'A'})
[1, 2, 3, 4, 5]
  • Key 函数的使用      list.sort() 和 sorted() 都可以加入参数key 来指定一个函数作用于list中的每一个项用来做比较.
例如按照字母的大小顺序做比较:
>>> sorted("This is a test string from Andrew".split(), key=str.lower)
['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']

还有一种经常使用的方法是利用对象中的某个元素。

例如:

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

  • 升序和降序

list.sort( ) 和 sorted( ) 两个方法中都接受一个布尔参数reverse,来确定升序排序还是降序排序


>>> a=[3,4,1,5,2]
>>> sorted(a,reverse=True)
[5, 4, 3, 2, 1]
>>> sorted(a)
[1, 2, 3, 4, 5]



  • 下面是C语言中常见的两种排序方法:

冒泡排序

def ballpop(list):
i=0
j=0
mid =0
for i in range(len(list)-1,0,-1):
  for j in range(0,i):
    if list[j]>list[j+1]:
      mid=list[j+1]
      list[j+1]=list[j]
      list[j]=mid
print list

list = [15,10,23,6,11,105,70,2,54,21,8]
ballpop(list)

 用sort一句话,list.sort(),print list 

插入排序:

def insert(x,n):
  i=1
     while i<n-1:
         key=x[i]
         j=i-1
        while j>=0 and key<x[j]:
            x[j+1]=x[j]
            j-=1
           x[j+1]=key
       i+=1
return x


print select([1,10,2,5,41,25,3,48],8)   #[1, 2, 3, 5, 10, 25, 41, 48]

推荐阅读