Python的列表排序和字典排序
在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中排序的方法。