Sort函数
sort函数的使用方法定义:
>>> help(list.sort)
Help on method_descriptor:
sort(...)
L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;
cmp(x, y) -> -1, 0, 1
作用:对原序列进行排序,也就是直接在原序列上操作,没有返回值
cmp:为一个定制的比较函数,接受两个参数,并且如果第一个参数小于第二个
参数,则返回一个负数,大于则返回一个整数,等则返回0。默认值为None。
key:也是一个函数,这个函数会从每个元素中提取一个用于比较的关键字。默认值为None。
reverse:接受False或者True,表示是否逆序。如设置为True,表示颠倒。表示是否颠倒排列顺序
代码示例:
1、按照序列的长度倒序排序
#encoding=utf-8
list1 = [(1,5,3),(1,3,6,3),(1,1,2,4,5,6),(1,9)]
def L(tup) :
Print tup
return len(tup) #元素的长度就是list1中元素的权值,sort根据这个权值进行排序
list1.sort(key = L,reverse = True)
‘’’
# L相当于传递了函数对象,这句话相当于把list1遍历,把每个元素去调用L函数,每次返回的值组成列表,然后就按照这个列表的元素的大小进行排序
>>> a=[]
>>> for i in list1:
... a.append(len(i))
...
‘’’
print list1
---------------------------
(1, 5, 3)
(1, 3, 6, 3)
(1, 1, 2, 4, 5, 6)
(1, 9)
[(1, 1, 2, 4, 5, 6), (1, 3, 6, 3), (1, 5, 3), (1, 9)]
'''
2、按照元组中的最后一个元素的大小来进行排序
'''
print "--"*10
def zh(tup):
print tup[-1]
return tup[-1]
'''
a=[]
for i in tup:
a.append(i[-1])
return a
'''
list1.sort(key = zh,reverse = True) #reverse=True代表逆序排列
print list1
--------------------
6
3
3
9
[(1, 9), (1, 1, 2, 4, 5, 6), (1, 3, 6, 3), (1, 5, 3)]
'''
3、按照元组中的所有元素的平方之和来进行排序
'''
print "--"*10
def zh(tup):
sum=0
print tup
for i in tup:
print i
sum+=i**2
return sum
list1.sort(key = zh,reverse = True)
print list1
---------------------------------------------
(1, 9)
1
9
(1, 1, 2, 4, 5, 6)
1
1
2
4
5
6
(1, 3, 6, 3)
1
3
6
3
(1, 5, 3)
1
5
3
[(1, 1, 2, 4, 5, 6), (1, 9), (1, 3, 6, 3), (1, 5, 3)]
4、按照元组中的绝对值来进行排序
1)cmp和key都有
print "按照元组中的绝对值来进行排序"
print "--"*10
def compare(a,b):
#升序排
if abs(a)>abs(b):
return 1
elif abs(a)==abs(b):
return 0
else:
return -1
def L(tup) :
return tup[0]
list1 = [(-1,5,3),(-5,3,6,3),(1,1,2,4,5,6),(2,9),(-2,10)]
list1.sort(cmp=compare,key = L,reverse = False) #升序 不颠倒
print list1
按照元组中的绝对值来进行排序
--------------------
[(-1, 5, 3), (1, 1, 2, 4, 5, 6), (2, 9), (-2, 10), (-5, 3, 6, 3)] 升序排
'''
list1.sort(cmp=compare,key = L,reverse = True) #升序,颠倒
print list1
[(-5, 3, 6, 3), (2, 9), (-2, 10), (-1, 5, 3), (1, 1, 2, 4, 5, 6)] 降序排
2)只用key
>>> def L(tup):
... return abs(tup[0])
...
>>> list1.sort(key=L,reverse=True)
>>> list1
[(-5, 3, 6, 3), (2, 9), (-2, 10), (-1, 5, 3), (1, 1, 2, 4, 5, 6)]
3)只用cmp
>>> def cm(a,b):
... if abs(a[0])>abs(b[0]):
... return 1
... elif abs(a[0])<abs(b[0]):
... return -1
... else:
... return 0
...
>>> list1
[(-5, 3, 6, 3), (2, 9), (-2, 10), (-1, 5, 3), (1, 1, 2, 4, 5, 6)]
>>> list1.sort(cmp=cm,reverse=False)
>>> list1
[(-1, 5, 3), (1, 1, 2, 4, 5, 6), (2, 9), (-2, 10), (-5, 3, 6, 3)]
>>>
5、一个包含多个单词的list,自定义比较函数,函数需要基于字符串的长度做比较,越长的越大。
'''
list1 = ["i","am","a","girl","i","like","listen","music"]
def compare(a,b):
if abs(a)>abs(b):
return 1
elif abs(a)==abs(b):
return 0
else:
return -1
def L(tup) :
return len(tup)
list1.sort(cmp=compare,key = L,reverse = False)
print list1
-------------------------------
['i', 'a', 'i', 'am', 'girl', 'like', 'music', 'listen']
自定义比较函数,升序排
def compare(a,b):
if len(a)>len(b):
return 1
elif len(a)==len(b):
return 0
else:
return -1
list2=["3e","zhang","is"]
list2.sort(cmp=compare,reverse = False) #升序,不颠倒
print list2
-------------------------
zhang 3e
is zhang
is zhang
is 3e
['3e', 'is', 'zhang']
自定义比较函数,降序排
def compare(a,b):
print a,b
if len(a)<len(b):
return 1
elif len(a)==len(b):
return 0
else:
return -1
list2=["3e","zhang","is"]
list2.sort(cmp=compare,reverse = False) #降序,不颠倒
print list2
-----------------------
zhang 3e
is zhang
is 3e
['zhang', '3e', 'is'] #降序
list2.sort(cmp=compare) #降序
print list2
-----------------------
zhang 3e
is zhang
is 3e
['zhang', '3e', 'is']
list2.sort(cmp=compare,reverse = True) #降序,颠倒
print list2
zhang is
3e zhang
3e is
['3e', 'is', 'zhang'] #升序