Chinaunix首页 | 论坛 | 博客
  • 博客访问: 104459
  • 博文数量: 67
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 577
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-16 09:51
个人简介

啄木鸟专吃虫,故名啄木鸟。

分类: Python/Ruby

2014-08-22 11:23:03

处于python学习的菜鸟阶段的初级阶段,对于这个sort和sorted真是没搞明白。今天好好来理一理.....
首先,sort是list的成员函数
sorted是python的内建函数
基础用法:

>>> st
'feaqsa'
>>> sorted(st) #   返回序列排序后的列表,st并未变化
['a', 'a', 'e', 'f', 'q', 's']
>>> st
'feaqsa'
>>> st.sort()   #为什么报错呢,因为sort是list的内建函数,那肯定只能用在list中咯
Traceback (most recent call last):
  File "", line 1, in
    st.sort()
AttributeError: 'str' object has no attribute 'sort'

sort:
>>> l = [5, '1', 8, 2, 's', 'g']
>>> p=l.sort()
>>> print p   #这里是为什么呢,因为sort是原地排序,是修改list本身,并不会返回东西,所以p是 None
None
>>> s   #s本身被排序
[2, 5, 8, '1', 'g', 's']

sorted:
>>> l= [5, '1', 8, 2, 's', 'g']
>>> p=sorted(l)
>>> print p   #这里是为什么呢,这是因为sorted是返回list排序后的副本,所以p是一个已经排序好的列表。而下面的l打印,是未经排序的。这是因为sorted不是原地排序嘛,他只是返回一个排序的副本而已啦。
[2, 5, 8, '1', 'g', 's']
>>> l
[5, '1', 8, 2, 's', 'g']

进阶用法:
sort的函数模型:L.sort(func=None, key=None, reverse=False)
首先,函数参数解释:
func:默认即内建函数cmp(a,b),a大于 等于 小于b时,返回分别为1,0,-1,不过据说这个在3.x中已经没有了,确实这个我一直不晓得是什么意思,因为我觉得他和key功能有点重复。

key:比较的关键字,可以是函数。他主要作用是用来为某个元素提取比较值。例如要比较一个list=(list1,list2,list3...),就可以把key设定为list元素中的第n个元素进行排序,例如:
>>> lst=[('a',11),('e',2),('f','c',3,6),('b',2,23)]
>>> lst.sort(key=lambda x:x[1])# 以各元素的第2个关键字的值来进行比较排序
>>> lst
[('e', 2), ('b', 2, 23), ('a', 11), ('f', 'c', 3, 6)]

如果想要多重排序,按照元素第而关键字排序后,再按照第一关键字排序:
>>> lst=[('a',11),('e',2),('f','c',3,6),('b',2,23)]
>>> lst.sort(key=lambda x:(x[1],x[0]))
>>> lst
[('b', 2, 23), ('e', 2), ('a', 11), ('f', 'c', 3, 6)]


>>> lst=[('b',11),('a',2),('f','c',3,6),('e',23,2)]
>>> lst.sort(lambda x,y:cmp(x[1],y[1]))
>>> lst
[('a', 2), ('b', 11), ('e', 23, 2), ('f', 'c', 3, 6)]

>>> lst=['k','A','e','b','d','B']
>>> lst.sort(key=lambda x:x.lower())  #按照小写比较
>>> lst
['A', 'b', 'B', 'd', 'e', 'k']

reverse:reverse=False反序,True为顺序,默认为True
>>> lst1=['k','e','b','d']
>>> lst1.sort(reverse=False)
>>> lst1
['b', 'd', 'e', 'k']

sorted函数模型:sorted(iterable, cmp=None, key=None, reverse=False)
参数和list的build-in sort是类似的,interable是可迭代对象str list dic tuple等。

Operator 模块函数(抄抄更健康!)
上面的key参数的使用非常广泛,因此python提供了一些方便的函数来使得访问方法更加容易和快 速。operator模块有itemgetter,attrgetter,从2.6开始还增加了methodcaller方法。使用这些方法,上面的操作 将变得更加简洁和快速:
原型:元组list   student_tuples = [
        ('john''A', 15),
        ('jane''B', 12),
       ('dave''B', 10),]
或者字典list     student_objects = [
        {'name':'john','grade': 'A', 'age':15},
        {'name':'jane','grade': 'B', 'age':12},
       {'name':'dave', 'grade':'B', 'age':10}]
>>> from operator import itemgetter, attrgetter
>>> sorted(student_tuples, key=itemgetter(2))
[('dave''B', 10), ('jane''B', 12), ('john''A', 15)]
>>> sorted(student_objects, key=attrgetter('age'))
[('dave''B', 10), ('jane''B', 12), ('john''A', 15)]
 

operator模块还允许多级的排序,例如,先以grade,然后再以age来排序:

>>> sorted(student_tuples, key=itemgetter(1,2))
[('john''A', 15), ('dave''B', 10), ('jane''B', 12)]
>>> sorted(student_objects, key=attrgetter('grade''age'))
[('john''A', 15), ('dave''B', 10), ('jane''B', 12)]

再抄一个例子,一眼就能看明白的:
theList = [
            {'a':5,'b':5},
            {'a':6,'b':2},
            {'a':2,'b':7},
            {'a':5,'b':2},
            {'a':1,'b':0},
            {'a':5,'b':1},
            {'a':6,'b':1},
            {'a':2,'b':9}
]
需要实现的结果,即按照a倒序,按照b顺序。看看python一句解决问题:sorted(theList,key=lambda x: (-x['a'],x['b']))  很神奇的赶脚。
result = [
            {"a": 6,"b": 1},
            {"a": 6,"b": 2},
            {"a": 5,"b": 1},
            {"a": 5,"b": 2},
            {"a": 5,"b": 5},
            {"a": 2,"b": 7},
            {"a": 2,"b": 9},
            {"a": 1,"b": 0}

既然上面都已经设置到字典,那就顺便再举个字典的例子:
OrderedDict,字典不是序列,是无序的,但是想想办法还是可以排序的,那就是OrderedDict。

OrderedDict是collections模块中的一个包,能够记录字典元素插入的顺序,常常和排序函数一起使用来生成一个排序的字典。
>>> d
{'orange': 2, 'pear': 1, 'banana': 3, 'apple': 4}

>>> import collections
>>> p = collections.OrderedDict(sorted(d.items(),key=lambda x:x[0]))#按照各元素中的首元素大小排序>>> p
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])
>>> collections.OrderedDict(sorted(d.items(),key=lambda x:x[1]))
OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])


>>> collections.OrderedDict(sorted(d.items(),key = lambda t:len(t[0])))#按照各元素中的首元素长度排序
OrderedDict([('pear', 1), ('apple', 4), ('orange', 2), ('banana', 3)])


阅读(1656) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~