在Python中,列表(list)和字典(dict)中存放的数据在默认情况下都是无序的,如果我们需要按照某种排序方式对这些数据进行处理,需要对它们进行排序。在Python中对列表和字典进行排序很容易,可选的方式也比较多,这里一一介绍一下。
一、列表排序
1、sort()方法
sort()方法是列表的内部方法,调用方式是a_list.sort(cmp=None, key=None, reverse=False),sort是把a_list原地排序,并不返回一个有序的序列副本,而只是把当前序列变得有序。
参数说明:
cmp:用于比较的函数,接受两个参数,根据给定的规则比较返回1(大于),0(相等),-1(小于),表示第一个参数和第二个参数的大小关系
key:用列表的某个属性和函数进行作为关键字,函数只接受一个参数(列表的元素),函数的返回值表示此元素的权值,按照权值大小进行排序
reverse:表示是否逆序,决定排序规则是升序或者降序,默认为False(升序排列)
通常,key和reverse比cmp快很多,因为对每个元素它们只处理一次;而cmp会处理多次,因此很少使用cmp参数。示例:
# basic sort example
>>> a = [3, 6, 8, 78, 1, 23, 45, 9]
>>> a.sort()
>>> print a
[1, 3, 6, 8, 9, 23, 45, 78]
# sort with reverse=True
>>> a = [3, 6, 8, 78, 1, 23, 45, 9]
>>> a.sort(reverse=True) # 反序
>>> print a
[78, 45, 23, 9, 8, 6, 3, 1]
# sort with cmp parameter
>>> a_list = [('b', 2), ('a', 1), ('c', 3), ('d', 4)]
>>> print a_list.sort(cmp=lambda x, y:cmp(x[1], y[1]))
[('a', 1), ('b', 2), ('c', 3), ('d', 4)]
# sort with key parameter
>>>a_list = [('b', 2), ('a', 1), ('c', 3), ('d', 4)]
>>>print a_list.sort(key=lambda x:x[1]))
[('a', 1), ('b', 2), ('c', 3), ('d', 4)]
2、sorted()方法
sorted()方法是Python内建方法,调用方式和sort()方法基本一致:sorted(any_iterator, cmp=None, key=None, reverse=False),sorted可以将任何可迭代的对象进行排序,并最终返回一个列表。
参数说明和sort一样,示例:
# basic sort example
>>> a = [3, 6, 8, 78, 1, 23, 45, 9]
>>> b = sorted(a)
>>> c = sorted(a, reverse=True) # 反序
>>> print b
[1, 3, 6, 8, 9, 23, 45, 78]
>>> print c
[78, 45, 23, 9, 8, 6, 3, 1]
# sort other iteratable objects
>>> d = {'data1': 3, 'data2': 1, 'data3': 2, 'data4': 4}
>>> sorted(d.iteritems(), key=itemgetter(1), reverse=True)
[('data4', 4), ('data1', 3), ('data3', 2), ('data2', 1)]
3、对象列表排序
对于一个包含多个对象的列表,我们也可以根据对象的某个属性对它们进行排序,比如我们有下面一个Class:
class Student(object):
def __init__(self, name, age):
self.name = name
self.age = age
def __unicode__(self):
return self.name
然后我们有这样一个列表:
students = [Student('zhang', 12), Student('li', 10), Student('wu', 14), Student('xing', 11)]
最后我们根据每个Student的age属性对列表进行排序,我们有两种不同的写法:
# first method
>>> sorted_students = sorted(students, key=lambda s: s.age)
# second method
>>> students.sort(key=lambda s: s.age)
二、字典排序
Python中的字典(dict)是无序的,其中的键(key)是不可重复的;对字典进行排序一般是根据元素的key或value的大小,主要使用sorted方法。使用起来比较简单,举几个例子:
>>> a_dict = {'a': 3, 'c': 1, 'b': 7, 'd': 4}
# use lambda
>>> sorted(a_dict.iteritems(), key=lambda e:e[0]) # sort by key
[('a', 3), ('b', 7), ('c', 1), ('d', 4)]
>>> sorted(a_dict.iteritems(), key=lambda e:e[1]) # sort by value
[('c', 1), ('a', 3), ('d', 4), ('b', 7)]
# use itemgetter
>>> from operator import itemgetter
>>> sorted(a_dict.iteritems(), key=itemgetter(0)) # sort by key
[('a', 3), ('b', 7), ('c', 1), ('d', 4)]
>>> sorted(a_dict.iteritems(), key=itemgetter(1)) # sort by value
[('c', 1), ('a', 3), ('d', 4), ('b', 7)]
总结
总体来说,Python中的排序主要是使用sort和sorted函数,sort只能用在列表上,sorted可以对任意可迭代的对象进行排序;两者的调用方式比较类似。了解了这些,你就基本上掌握了Python中排序的方法。