不规则数据排序 Python sort sorted

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)
至此可以得到一个 单机索引倒序排序的 列表

最后提问
如何得到正序的列表,但是不规则命名的单集排序靠后呢?

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值