转:Python排序
1.字符串列表排序列表的排序是python内置功能,自身含有sort方法 。如果元素是字符串,会分解成字符比较,而字符的大小是根据字符对应ascii码的大小。
Python代码
[*]>>> str_list = ['spring', 'summer', 'autumn', 'winter']
[*]>>> str_list.sort()
[*]>>> print str_list
[*]['autumn', 'spring', 'summer', 'winter']
Python代码
[*]>>> str_list = ['aB', 'Ab', 'AB', 'ab']
[*]>>> str_list.sort()
[*]>>> print str_list
[*]['AB', 'Ab', 'aB', 'ab']
Python代码
[*]>>> str_list = ['a123', 'B123', 'c123']
[*]>>> str_list.sort()
[*]>>> print str_list
[*]['B123', 'a123', 'c123']
如果忽略大小字母,让上面结果显示为:['a123', 'B123', 'c123']。怎么做了?
很容易想到DSU用法,decorate-sort-undecorate封装-排序-解封,既简单又快速:
Python代码
[*]>>> str_list = ['c123', 'a123', 'B123']
[*]>>> temp_list = [(x.lower(), x) for x in str_list] #decorate
[*]>>> temp_list.sort() #sort
[*]>>> str_list = for x in temp_list] #undecorate
[*]>>> print str_list
[*]['a123', 'B123', 'c123']
这是一种重要的编程思想,你现在所处的情景,你想要的结果,你要做的就是搭一座桥梁,让两者之间可以联通!这是的桥梁就是temp_list。
如果你确定列表中的元素都是字符串,而且你使用的是Python2.4以上版本,那么使用sorted方法来得更简单:
Python代码
[*]>>> str_list = ['c123', 'a123', 'B123']
[*]>>> sorted(str_list, key=str.lower)
[*]>>> str_list = sorted(str_list, key=str.lower)
[*]['a123', 'B123', 'c123']
这里我提示一点sorted方法并没有直接作用于目标列表,而是返回一个排序后的列表。如果你知道排序的是unicode对象列表,可以使用key=unicode.lower,或者key = lambda s: s.lower()
这里给你补充点知识:
python有三种字符串类型:str、unicode、basestring。basestring是抽象类,不能实例化,str和unicode是basestring的子类。普通字符串str怎么转换为Unicode字符串?'Hello'+u' '+'World' 这样就行了,连接中有一个是unicode字符串,结果都为unicode字符串。如果你想知道得更详细,我会写另一篇文章。
lambda 是匿名函数,python中非常有用的一个函数,掌握它对你受益匪浅。
这里你会不禁赞叹python的强大,简单而且优美。程序就是一件艺术品,python无疑是一把优质的雕琢刀,而你的地位恰好是雕塑家。成功与否,不是取决于雕琢刀的好坏,而是你雕刻的方法,这正是我们应该学习的!
也许上面两种方法你都没有想到,你想到的是:难道不能重新构造比较方法cmp()吗?
Python代码
[*]>>> def mycmp(a, b):
[*] return cmp(a.lower(), b.lower())
[*]
[*]>>> str_list = ['c123', 'a123', 'B123']
[*]>>> str_list.sort(mycmp)
[*]>>> print str_list
[*]['a123', 'B123', 'c123']
不知你发现没有,每两个元素进行比较都会执行两次lower()方法,如果列表中元素为n,那要执行多少次lower()?虽然不推荐这样做,但也给我们提供了一种思路,如果不是字符串列表,而是结构很复杂的数据列表,我们就可以采用这样方法!
2.数字列表排序
Python代码
[*]>>> num_list =
[*]>>> num_list.sort()
[*]>>> print num_list
[*]
小数也同样适用
Python代码
[*]>>> num_list =
[*]>>> num_list.sort()
[*]>>> print num_list
[*]
我用的是Python2.7,如果你使用是其他版本,可能会出现不同的结果,如:9.1变成9.100000000001 。这涉及到python中小数是怎么存储的,这里就不多说了!
3.字典数据排序
学Java的人都知道Map,而字典就是Python中的“Map”,键值对映射。字典中元素的存储是无序的,怎么对字典数据进行排序?
Python代码
[*]>>> mydict = {"A01":"first", "A14":"second", "Aa1":"third"}
[*]>>> print mydict
[*]{'A14': 'second', 'A01': 'first', 'Aa1': 'third'}
[*]>>> items = mydict.items()
[*]>>> print items
[*][('A14', 'second'), ('A01', 'first'), ('Aa1', 'third')]
[*]>>> items.sort()
[*]>>> print items
[*][('A01', 'first'), ('A14', 'second'), ('Aa1', 'third')]
[*]>>> new_list = for key, value in items]
[*]>>> print new_list
[*]['first', 'second', 'third']
前3行说明字典中元素存储是无序的,你构造的字典和实际存储的字典 里元素的顺序并不一样!字典的items()方法能够把字典转换为元组的列表,再对元组列表进行排序,得到自己想要的结果。
另一种思路:得到字典key列表,排序后,依次取出value,构造成列表就是你的结果。
Python代码
[*]>>> mydict = {"A01":"first", "A14":"second", "Aa1":"third"}
[*]>>> keys = mydict.keys()
[*]>>> keys.sort()
[*]>>> new_list = for key in keys]
[*]>>> print new_list
[*]['first', 'second', 'third']
通过映射的方法更有效的执行最后一步
Python代码
[*]>>> mydict = {"A01":"first", "A14":"second", "Aa1":"third"}
[*]>>> keys = mydict.keys()
[*]>>> keys.sort()
[*]>>> new_list = map( mydict.get,keys )
[*]>>> print new_list
[*]['first', 'second', 'third']
利用lamdba函数,选择根据key或value排序
Python代码
[*]>>> sorted(mydict.items(), key=lambda d:d)
[*][('A01', 'first'), ('A14', 'second'), ('Aa1', 'third')]
[*]>>> mydict = {"A01":"first", "A14":"second", "Aa1":"third"}
[*]>>> sorted(mydict.items(), key=lambda d:d)
[*][('A01', 'first'), ('A14', 'second'), ('Aa1', 'third')]
[*]>>> sorted(mydict.items(), key=lambda d:d)
[*][('A01', 'first'), ('A14', 'second'), ('Aa1', 'third')]
[*]>>> print mydict
[*]{'A14': 'second', 'A01': 'first', 'Aa1': 'third'}
4.对象排序
Python代码
[*]>>> class Sortobj:
[*] a = 0
[*] b = ''
[*] def __init__(self, a, b):
[*] self.a = a
[*] self.b = b
[*] def printab(self):
[*] print self.a, self.b
[*]
[*]
[*]>>> obja = Sortobj(343, 'keen')
[*]>>> objb = Sortobj(56, 'blue')
[*]>>> objc = Sortobj(2, 'aba')
[*]>>> objd = Sortobj(89, 'iiii')
[*]>>> obj_list =
[*]>>> for obj in obj_list:
[*] obj.printab()
[*]
[*]
[*]343 keen
[*]56 blue
[*]2 aba
[*]89 iiii
[*]>>> obj_list.sort(lambda x,y: cmp(x.a, y.a)) #按对象的a属性进行排序
[*]>>> for obj in obj_list:
[*] obj.printab()
[*]
[*]
[*]2 aba
[*]56 blue
[*]89 iiii
[*]343 keen
[*]>>> obj_list.sort(lambda x,y: cmp(x.b, y.b)) #按对象的b属性进行排序
[*]>>> for obj in obj_list:
[*] obj.printab()
[*]
[*]
[*]2 aba
[*]56 blue
[*]89 iiii
[*]343 keen
5.字典列表排序
元素全是字典的列表,如何排序?其实把上面的方法综合起来就能实现:
Python代码
[*]input = [{'name': 'Homer', 'age': 39}, {'name': 'Bart', 'age':10},{'name': 'Wang', 'age':10},{'name': 'Ab', 'age':10}]
[*]print input
[*]input.sort(lambda x,y : cmp(x['name'], y['name']))
[*]print input
如果想降序排列,
Python代码
[*]input.sort(lambda x,y : -cmp(x['name'], y['name']))
如果你还有什么关于排序的问题需要解决,欢迎留言!
页:
[1]