Python的列表排序和字典排序
2014-03-13
Python  /  / 已有3032人围观

在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中排序的方法。


Over!

本文地址:http://xianglong.me/article/learn-python-2-list-dict-sort/

特别声明:本站文章,如非注明,皆为降龙原创。转载需注明本文链接并保证链接可用。