鱼C论坛

 找回密码
 立即注册
查看: 2119|回复: 8

[已解决]怎么排序字典,当字典里的值都是一个类的实例化对象,键为不同的字符串,根...

[复制链接]
发表于 2016-9-24 02:33:21 | 显示全部楼层 |阅读模式

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

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

x
就像这样
class A:
       def __init__(self):
                    self.x=10

>>>a=A()
>>>a.x =3
>>>b=A()
>>>c =A()
>>>c.x=5
>>>dic={"01": a , "02" : b , "03": c)
>>>dic
{"01": a , "02" : b , "03": c)

这个时候字典虽然创立了,但是我想让其每一项根据其值的 .x类属性的值排序,从大到小,
所以 字典顺序应该变为这样{ "02" : b , "03": c, "01": a}
然后将其排序后的字典赋值给另一个空字典 x
大神求解!
最佳答案
2016-9-24 12:20:56
OrderedDict
字典排序后还想保持为字典类型,可以用 有序字典对象OrderedDict
  1. >>> d={"a":3,"b":1,"c":5,"d":2}
  2. >>> from collections import OrderedDict as ODic
  3. >>> odic=ODic()
  4. >>> for v,k in sorted(zip(d.values(),d.keys())):
  5.         odic[k]=v

  6.        
  7. >>> odic
  8. OrderedDict([('b', 1), ('d', 2), ('a', 3), ('c', 5)])
  9. >>> odic['a']
  10. 3
复制代码


用于本题,就这样:

  1. from collections import OrderedDict as ODic
  2. odic=ODic()
  3. for k, v in sorted(dic.items(), key=lambda i: i[1].x, reverse=True):
  4.     odic[k]=v
  5. for k in odic:
  6.     print(k, odic[k])
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-9-24 02:37:36 | 显示全部楼层
鱼友们
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-9-24 08:58:44 | 显示全部楼层
字典是无序的,排序没啥意义~

点评

+1  发表于 2016-9-24 09:41
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-9-24 09:46:34 | 显示全部楼层
  1. sorted(dic.items(), key=lambda i: i[1].x, reverse=True)
复制代码

点评

这样得到的是k,v元组的列表,不是字典了~  发表于 2016-9-24 09:57
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2016-9-24 09:53:33 | 显示全部楼层
字典是无序的,用的时候就要注意了.
但是可以把key复制到列表来排序,曲线的方式来实现
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-9-24 12:20:56 | 显示全部楼层    本楼为最佳答案   
OrderedDict
字典排序后还想保持为字典类型,可以用 有序字典对象OrderedDict
  1. >>> d={"a":3,"b":1,"c":5,"d":2}
  2. >>> from collections import OrderedDict as ODic
  3. >>> odic=ODic()
  4. >>> for v,k in sorted(zip(d.values(),d.keys())):
  5.         odic[k]=v

  6.        
  7. >>> odic
  8. OrderedDict([('b', 1), ('d', 2), ('a', 3), ('c', 5)])
  9. >>> odic['a']
  10. 3
复制代码


用于本题,就这样:

  1. from collections import OrderedDict as ODic
  2. odic=ODic()
  3. for k, v in sorted(dic.items(), key=lambda i: i[1].x, reverse=True):
  4.     odic[k]=v
  5. for k in odic:
  6.     print(k, odic[k])
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-9-24 12:24:44 | 显示全部楼层
OrderedDict内部维护着一个根据键插入顺序排序的双向链表。
需要注意的是,一个OrderedDict的大小是一个普通字典的两倍,因为它内部维护着另外一个链表。

评分

参与人数 1贡献 +8 收起 理由
wei_Y + 8 支持楼主!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-18 15:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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