对字典按照Key或value进行排序 和 list.sort()的使用

转载自:https://www.jianshu.com/p/44544b166b57

test_data_1 = sorted(c.items(), key=lambda x: (pd.to_datetime
(x[1][x[1].IS_STATION == mlin1].head(1).reset_index().SITE_TIME[0])))
trace_dict_sig1 = dict(test_data_1)  # 字典进行了按照键值(DataFrame中的事件字段)排序,年月日,时分秒

按照字典的值value进行排序

.sort()方法只有列表才有,集合,字典,元祖都没有sort()方法。所以对字典进行排序的时候先将字典转化成列表。注意这里转化的时候一定是字典的items(),转化结束之后,每一个键值对是一个元祖,这些元祖就是生成的列表里的元素。sort()方法里有两个参数,一个是reverse,将它设置为True的时候,降序排序。另一个参数key,是一个函数,指定的是以什么元素为比较进行排序。这里使用的是lambda匿名函数,其中x是随意起的名字,指代列表中的每一个元素,这里就是待排序的元祖们。因为这里的元祖是是由字典中键值对转化过来的,x[1]指代的第二个元素,即字典中的value。也就是说以value为比较进行排序。

代码如下:

d = {1: 1000, 4: 250, 2: 750, 3: 500}
print(d) # {1: 1000, 4: 250, 2: 750, 3: 500}
lt = list(d.items())
print(lt) # [(1, 1000), (4, 250), (2, 750), (3, 500)] 键值对转化成了元祖
print(type(lt[0])) # <class 'tuple'>
print(lt[1][1]) # 250 第二个元素的第二个值
# must use keyword argument for key function
# tuple index out of range 注意这里元素从0开始
lt.sort(key=lambda x:x[1],reverse=True) # 按照第二个元素的大小进行排序
print(lt) # [(1, 1000), (2, 750), (3, 500), (4, 250)]

发散:带有优先级的比较

a = [(27, 35), (74, 55), (38, 55), (85, 55), (36, 58)]

# 按照第二个元素从小到大排序,相同时按第一个元素从大到小排序
a.sort(key=lambda x: (x[1], -x[0]))#排序键值两个
# 中间3个的第二个元素相同,第一个元素是从大到小 
print(a)  # [(27, 35), (85, 55), (74, 55), (38, 55), (36, 58)]

# 逆序,相当于先按第二个元素从大到小,再按第一个元素从小到大
a.sort(key=lambda x: (x[1], -x[0]), reverse=True)
# 中间3个的第二个元素相同,第一个元素是从小到大
print(a) # [(36, 58), (38, 55), (74, 55), (85, 55), (27, 35)]

这里的lambda函数,x是参数,代表列表当中的每一个元素。而匿名函数的函数体是要比较的内容。lambda的主体是一个表达式,而不是一个代码块。当有优先级比较的时候,注意lambda的表达式是一个tuple,也就是说按照这个tuple进行比较。这个时候对tuple的比较,和字符串的比较相似,先比较tuple当中的第一个元素,如果相同再比较第二个,以此类推。此外默认是按照从小到大的顺序排序,添加负号可以改为这个元素的比较是从大到小。因为两个负数相比,绝对值小的值更大。


不使用lambda函数:

key参数就是一个函数,使用普通的函数或者lambda函数都可以。当函数作为参数的时候不加小括号()。

a = [(27, 35), (74, 55), (38, 55), (85, 55), (36, 58)]
def cmp(x):
    return x[0]
a.sort(key=cmp)
print(a)

sorted()和list.sort()的区别

a = [(27, 35), (74, 55), (38, 55), (85, 55), (36, 58)]
def cmp(x):
    return x[0]
# a.sort(key=cmp)
b = sorted(a, key=cmp)
print(a) # [(27, 35), (74, 55), (38, 55), (85, 55), (36, 58)]
print(b) # [(27, 35), (36, 58), (38, 55), (74, 55), (85, 55)]

可以看到内置函数sorted()在执行之后返回一个新的列表,而list.sort()则是本地操作,会修改要排序的列表。

list.sort()只有列表可以使用这个方法,sorted可以对更多的组合类型进行排序。

a1 = {2,3,4,5,6,1,2} # set
b1 = sorted(a1) # list
print(b1) # [1, 2, 3, 4, 5, 6]
a2 = (2,3,4,5,6,1) # tuple
b1 = sorted(a2) # tuple
print(a2)   # (2, 3, 4, 5, 6, 1)
a3 = {32:2,76:4,13:6}
b3_1 = sorted(a3)
b3_2 = sorted(a3.values())
b3_3 = sorted(a3.items())
print(b3_1) # [13, 32, 76]
print(b3_2) # [2, 4, 6]
print(b3_3) # [(13, 6), (32, 2), (76, 4)]
a4 = [(1,2),(1,2),(1,1)]
b4 = sorted(a4)
print(b4) # [(1, 1), (1, 2), (1, 2)]

numpy库里的argsort()函数,返回从大到小的索引值

import numpy as np
arr = np.array([3,1,4,2])
t = np.argsort(arr)
print(t) # [1 3 0 2]

转载自:https://www.jianshu.com/p/44544b166b57

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值