sort
sort 是应用在list上的方法: list的sort方法返回的是对已经存在的列表进行操作,无返回值,
sort 有3个参数:
- cmp 比较函数,含2个参数,参数的值都是从可迭代对象中取出的,必须遵守大于返回1,等于返回0,小于返回-1
- key 比较函数,含1个参数,参数的值取自可迭代对象中,指定可迭代对象中的一个元素进行排序
- reverse 排序规则, bool值,默认False(升序),True(倒序)
看一个例子
1. 简单排序
L = [2, 3, 1]
# 升序排序
L.sort(reverse=False)
# 输出结果为
print L
>> [1, 2, 3]
2.key参数
L = [('a', 2), ('b', 1), ('c', 3), ('d', 4)]
# key 匿名函数(可以定义非匿名函数)形式 对迭代元素的 索引1号位进行排序
L.sort(key=lambda x:x[1], reverse=False)
# 输出结果为
print L
>> [('b', 1), ('a', 2), ('c', 3), ('d', 4)] # 以迭代元素的 索引1号为标准进行排序
3.cmp参数
- 利用cmp函数
L = [('a', 2), ('b', 1), ('c', 3), ('d', 4)] # cmp 匿名函数(可以定义非匿名函数)形式 对迭代元素的 索引1号位进行排序 L.sort(cmp=lambda x,y: cmp(x[1], y[1]), revserse=False) # 输出结果 print L >> [('b', 1), ('a', 2), ('c', 3), ('d', 4)] # 以迭代元素的 索引1号为标准进行排序
- 利用自定义函数
def cmp_func(x, y): x_num = x[1] y_num = y[1] if x_num > y_num: return 1 elif x_num == y_num: return 0 else: return -1 L = [('a', 2), ('b', 1), ('c', 3), ('d', 4)] # cmp 匿名函数(可以定义非匿名函数)形式 对迭代元素的 索引1号位进行排序 L.sort(cmp=cmp_func, reverse=False) # 输出结果 print L >> [('b', 1), ('a', 2), ('c', 3), ('d', 4)] # 以迭代元素的 索引1号为标准进行排序
sorted
sorted 不同于 sort只能用于 list, sorted可以接受任意迭代对象,返回一个 新的 list类型的数据
sorted 有4个参数- iterable 任意迭代对象
- cmp 与sort使用类似
- key 同上
- reserver 同上
sorted 的使用与 sort一致 可参考sort进行操作
一个不规范的排序问题
需求: 有一部(以 安家
为例) 电视剧的 单集名称及其他信息,单集命名方式为: 01_安家; 02_安家… 其中掺杂这样的特别篇:
安家_特辑; 安家花絮; 安家_剧组轶事…等不规范的名字 数据格式如下:
"""变量解释: series_list 剧集列表 里面嵌套 单集信息字典"""
series_list = [
{
'video_id': 111,
'video_name': '01_安家',
'content_type': '电视剧'
},
{
'video_id': 112,
'video_name': '02_安家',
'content_type': '电视剧'
},
{
'video_id': 113,
'video_name': '03_安家',
'content_type': '电视剧'
},
{
'video_id': 114,
'video_name': '安家_特辑',
'content_type': '电视剧'
},
{
'video_id': 115,
'video_name': '安家_剧组轶事',
'content_type': '电视剧'
},
{
'video_id': 116,
'video_name': '安家花絮',
'content_type': '电视剧'
},
]
问题: 请以单集索引(如 02_安家
的索引为 2)对该数组进行排序
"""分析: 一般的做法是进行遍历 取出需要进行排序的部分 剔除掉 无单集索引的 然后进行有索引单集的排序但是 这种方法实不可取"""
利用sort进行排序(sorted类似)
这个时候 sort的参数key已经满足不了复杂的逻辑处理了 所以考虑用 cmp参数来输入自定义的排序函数 如下
def rankDeal(x, y):
try:
x_num = x['video_name'].split('_')[0]
except:
x_num = 0
try:
y_num = y['video_name'].split('_')[0]
except:
y_num = 0
if x_num > y_num:
return 1
elif x_num == y_num:
return 0
else:
return -1
series_list.sort(cmp=rankDeal, reverse=True)
至此可以得到一个 单机索引倒序排序的 列表
最后提问
如何得到正序的列表,但是不规则命名的单集排序靠后呢?