鱼C论坛

 找回密码
 立即注册
查看: 1511|回复: 29

[已解决]如何对字典里的值是列表按照一定规定排序

[复制链接]
发表于 2018-11-21 16:29:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
假设a字典是这样的 a={'h': [1, 5], 'k': [2, 3], 't': [4, 10], 'u': [3, 8], 'e': [8, 7]}
我现在要求以值(就是这个列表)第一个大于2作为筛选条件,然后在按第二个数的大小排序
也就是得到{'e': [8, 7],'u': [3, 8], 't': [4, 10]}这样的结果
请问该怎么写这个表达式
最佳答案
2018-11-21 17:31:07
  1. from collections import OrderedDict
  2. a={'h': [1, 5], 'k': [2, 3], 't': [4, 10], 'u': [3, 8], 'e': [8, 7]}

  3. # 过滤
  4. a = dict(filter(lambda x: x[1][0] > 2, a.items()))
  5. print(a)

  6. # 排序
  7. a = OrderedDict(sorted(a.items(), key=lambda t:t[1][1]))
  8. print(a)

  9. a = dict(a)
  10. print(a)
复制代码


解释一下,dict原则上是无序的,但是在python3.6(含3.6)以后,偷偷改成有序的了,但是顺序是按照添加进去的顺序排序。这个顺序并不太严谨,要是仅仅为了好看的话,直接转就行。
不过对python3.6以前的版本无效。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-11-21 16:36:31 | 显示全部楼层
字典是无序的
{e:v for e,v in a.items() if a[e][0]>2}生成新字典
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-21 16:43:41 | 显示全部楼层
同楼上,字典无序
但你可以使用collections模块(标准库)下的orderedDict,就是有序字典。
用法和dict都一样,就是名字不一样而已
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-21 17:06:28 | 显示全部楼层
天圆突破 发表于 2018-11-21 16:43
同楼上,字典无序
但你可以使用collections模块(标准库)下的orderedDict,就是有序字典。
用法和dict都 ...

哦,那你能演示一下,就我这个列子,写出代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-21 17:08:07 | 显示全部楼层
塔利班 发表于 2018-11-21 16:36
字典是无序的
{e:v for e,v in a.items() if a[e][0]>2}生成新字典

嗯,这个我也知道,但是有没有办法实现这个功能
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-21 17:11:01 | 显示全部楼层
fan1993423 发表于 2018-11-21 17:08
嗯,这个我也知道,但是有没有办法实现这个功能

你用的是字典就是无序的,要么就考虑使用OrderDict类,但这样对象就是OrderDict对象了,
不知道你后续要怎么使用,顺序如果对你意义很大的话可以考虑列表存储
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-21 17:13:11 | 显示全部楼层
塔利班 发表于 2018-11-21 17:11
你用的是字典就是无序的,要么就考虑使用OrderDict类,但这样对象就是OrderDict对象了,
不知道你后续要 ...

我这个要用字典,因为是键值对应关系,如果用列表就没有这样的对应关系,行,那你能就我这个列子用一下OrderedDict吗?我想看一下代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-21 17:14:19 | 显示全部楼层
塔利班 发表于 2018-11-21 17:11
你用的是字典就是无序的,要么就考虑使用OrderDict类,但这样对象就是OrderDict对象了,
不知道你后续要 ...

只要能实现我说的功能就行,哪怕得到的结果不再是字典
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-21 17:19:47 | 显示全部楼层
  1. from collections import OrderedDict
  2. a={'h': [1, 5], 'k': [2, 3], 't': [4, 10], 'u': [3, 8], 'e': [8, 7]}

  3. # 过滤
  4. a = dict(filter(lambda x: x[1][0] > 2, a.items()))
  5. print(a)

  6. # 排序
  7. a = OrderedDict(sorted(a.items(), key=lambda t:t[1][1]))
  8. print(a)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-21 17:21:21 | 显示全部楼层
直接用列表存储字典就行了,把原来字典中的键值对分别拆分成N个字典,每个字典作为列表中的一个元素就可以了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-21 17:25:32 | 显示全部楼层
  1. a={'h': [1, 5], 'k': [2, 3], 't': [4, 10], 'u': [3, 8], 'e': [8, 7]}
  2. from collections import OrderedDict
  3. od=OrderedDict()
  4. for e in sorted([e for e in a if a[e][0]>2],key=lambda x:a[x][1]):
  5.     od[e]=a[e]
  6. print(od)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-21 17:25:48 | 显示全部楼层

谢谢大佬,实现了功能,但是最后那个打印的内容OrderedDict([('e', [8, 7]), ('u', [3, 8]), ('t', [4, 10])])
有没有办法把这个OrderedDict去掉 就只要结果就行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-21 17:29:22 | 显示全部楼层

也谢谢大佬,如果只要结果就好了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-21 17:29:47 | 显示全部楼层
fan1993423 发表于 2018-11-21 17:25
谢谢大佬,实现了功能,但是最后那个打印的内容OrderedDict([('e', [8, 7]), ('u', [3, 8]), ('t', [4, 1 ...

你用字符串处理就行了,这你应该会吧
print(str(od)[13:-2])
虽然感觉怪怪的- -
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-21 17:31:07 | 显示全部楼层    本楼为最佳答案   
  1. from collections import OrderedDict
  2. a={'h': [1, 5], 'k': [2, 3], 't': [4, 10], 'u': [3, 8], 'e': [8, 7]}

  3. # 过滤
  4. a = dict(filter(lambda x: x[1][0] > 2, a.items()))
  5. print(a)

  6. # 排序
  7. a = OrderedDict(sorted(a.items(), key=lambda t:t[1][1]))
  8. print(a)

  9. a = dict(a)
  10. print(a)
复制代码


解释一下,dict原则上是无序的,但是在python3.6(含3.6)以后,偷偷改成有序的了,但是顺序是按照添加进去的顺序排序。这个顺序并不太严谨,要是仅仅为了好看的话,直接转就行。
不过对python3.6以前的版本无效。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-21 17:31:48 | 显示全部楼层
塔利班 发表于 2018-11-21 17:29
你用字符串处理就行了,这你应该会吧
print(str(od)[13:-2])
虽然感觉怪怪的- -

好吧,这个是字符串啊,我还以为是某个函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-21 17:32:31 | 显示全部楼层
天圆突破 发表于 2018-11-21 17:31
解释一下,dict原则上是无序的,但是在python3.6(含3.6)以后,偷偷改成有序的了,但是顺序是按照添加 ...

恩恩,我用的就是3.6的版本
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-21 17:38:33 | 显示全部楼层
天圆突破 发表于 2018-11-21 17:31
解释一下,dict原则上是无序的,但是在python3.6(含3.6)以后,偷偷改成有序的了,但是顺序是按照添加 ...

嗯,大佬完美解决了我的问题,我还有个问题就一起问了,就是有些时候要对时间排序 而格式是这样的
2018-7-14 14:05:43
2018-10-9  07:15:20这样,又该如何排序,我想到的是用split('-')和split(':')然后一个一个比大小来确定,但是这样吧感觉太费时费力,在time模块都可以用time.localtime()来列出时间,这个有没有可能反转来比较时间的先后顺序
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-21 17:40:02 | 显示全部楼层
塔利班 发表于 2018-11-21 17:29
你用字符串处理就行了,这你应该会吧
print(str(od)[13:-2])
虽然感觉怪怪的- -

同问塔利班大佬,上楼问题有办法解决吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-21 17:40:24 | 显示全部楼层
fan1993423 发表于 2018-11-21 17:31
好吧,这个是字符串啊,我还以为是某个函数

不是字符串,本身是个OrderDict类
是给他字符串化进行的处理
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-20 02:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表