python编程进阶(10):sort、lambda

sort与sorted区别

我们需要对List进行排序,Python提供了两个方法对给定的List L进行排序,

  • 方法1.用List的成员函数sort进行排序
  • 方法2.用built-in函数sorted进行排序

list.sort()与sorted()的不同在于,list.sort是在原位重新排列列表,而sorted()是产生一个新的列表。python中列表的内置函数list.sort()只可以对列表中的元素进行排序,而全局性的sorted()函数则对所有可迭代的对象都是适用的;并且list.sort()函数是内置函数,会改变当前对象,而sorted()函数只会返回一个排序后的当前对象的副本,而不会改变当前对象。

原型:sort(fun,key,reverse=False)

sorted(itrearble, cmp=None, key=None,reverse=False)

内置函数sort()

参数fun是表明此sort函数是基于何种算法进行排序的,一般默认情况下python中用的是归并排序,并且一般情况下我们是不会重写此参数的,所以基本可以忽略;

参数key用来指定一个函数,此函数在每次元素比较时被调用,此函数代表排序的规则,也就是你按照什么规则对你的序列进行排序;

参数reverse是用来表明是否逆序,默认的False情况下是按照升序的规则进行排序的,当reverse=True时,便会按照降序进行排序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

#coding:utf-8
from operator import attrgetter,itemgetter

list1 = [(2,'huan',23),(12,'the',14),(23,'liu',90)]

#使用默认参数进行排序,即按照元组中第一个元素进行排序
list1.sort()
print list1
#输出结果为[(2, 'huan', 23), (12, 'the', 14), (23, 'liu', 90)]

#使用匿名表达式重写key所代表的函数,按照元组的第二个元素(下标为1)进行排序
list1.sort(key=lambda x:(x[1]))
print list1
#[(2, 'huan', 23), (23, 'liu', 90), (12, 'the', 14)]

#使用匿名函数重写key所代表的函数,先按照元组中下标为2的进行排序,
# 对于下标2处元素相同的,则按下标为0处的元素进行排序
list1.sort(key=lambda x:(x[2],x[0]))
print list1
#[(12, 'the', 14), (2, 'huan', 23), (23, 'liu', 90)]

#使用operator模块中的itemgetter函数进行重写key所代表的函数,按照下标为1处的元素(第二个)进行排序
list1.sort(key=itemgetter(1))
print list1
#[(2, 'huan', 23), (23, 'liu', 90), (12, 'the', 14)]

全局函数sorted()

对于sorted()函数中key的重写,和sort()函数中是一样的,所以刚刚对于sort()中讲解的方法,都是适用于sorted()函数中。sorted()最后会将排序的结果放到一个新的列表中,而不是对iterable本身进行修改。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
sorted('123456')  # 字符串
['1', '2', '3', '4', '5', '6']

sorted([1,4,5,2,3,6]) # 列表
[1, 2, 3, 4, 5, 6]

sorted({1:'q',3:'c',2:'g'}) # 字典, 默认对字典的键进行排序
[1, 2, 3]

sorted({1:'q',3:'c',2:'g'}.keys()) # 对字典的键
[1, 2, 3]

sorted({1:'q',3:'c',2:'g'}.values()) # 对字典的值
['c', 'g', 'q']

sorted({1:'q',3:'c',2:'g'}.items()) # 对键值对组成的元组的列表
[(1, 'q'), (2, 'g'), (3, 'c')]

对元素指定的某一部分进行排序,关键字排序

1
2
3
4
5
6
7
8
9
10
11
# 想要按照-后的数字的大小升序排序。要用到key
s =['Chr1-10.txt','Chr1-1.txt','Chr1-2.txt','Chr1-14.txt','Chr1-3.txt','Chr1-20.txt','Chr1-5.txt']

sorted(s, key=lambda d :int(d.split('-')[-1].split('.')[0]))

# 输出 ['Chr1-1.txt', 'Chr1-2.txt', 'Chr1-3.txt','Chr1-5.txt', 'Chr1-10.txt', 'Chr1-14.txt', 'Chr1-20.txt']

# 这就是key的功能,制定排序的关键字,通常都是一个lambda函数,当然你也可以事先定义好这个函数。如果不讲这个关键字转化为整型,结果是这样的:
sorted(s, key=lambda d : d.split('-')[-1].split('.')[0])

# 输出 ['Chr1-1.txt', 'Chr1-10.txt','Chr1-14.txt', 'Chr1-2.txt', 'Chr1-20.txt', 'Chr1-3.txt', 'Chr1-5.txt']

这相当于把这个关键字当做字符串了,很显然,在python中,’2’ > ‘10’。cmp不怎么用,因为key和reverse比单独一个cmp效率要高。

lambda的各种用法

1, 用在过滤函数中,指定过滤列表元素的条件:

1
2
filter(lambda x: x % 3 == 0, [1, 2, 3, 4, 5, 6, 7, 8, 9])
> [3, 6, 9]

2, 用在排序函数中,指定对列表中所有元素进行排序的准则:

1
2
sorted([1, 2, 3, 4, 5, 6, 7, 8, 9], key=lambda x: abs(5-x))
> [5, 4, 6, 3, 7, 2, 8, 1, 9]

3, 用在reduce函数中,指定列表中两两相邻元素的结合条件

1
2
reduce(lambda a, b: '{}, {}'.format(a, b), [1, 2, 3, 4, 5, 6, 7, 8, 9])
> '1, 2, 3, 4, 5, 6, 7, 8, 9'

4, 用在map函数中,指定对列表中每一个元素的共同操作

1
2
map(lambda x: x+1, [1, 2,3])
> [2, 3, 4]

5, 从另一函数中返回一个函数,常用来实现函数装饰器(Wrapper),例如python的function decorators

1
2
3
4
5
def transform(n):
return lambda x: x + n
f = transform(3)
print f(3)
> 7

6,列表排序

1
2
3
4
5
6
a = [(1, 2), (4, 1), (9, 10), (13, -3)]
a.sort(key=lambda x: x[1])

print(a)
# Output: [(13, -3), (4, 1), (1, 2), (9, 10)]

7,列表并行排序

1
2
3
4
data = zip(list1, list2)
data = sorted(data)
list1, list2 = map(lambda t: list(t), zip(*data))
# zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。
-------------Thanks for Reading!-------------