列表到dict:错误排序的结果

时间:2015-07-26 20:10:32

标签: python sorting

我尝试对此进行排序

{1: 2, 3: 4, 4: 3, 2: 1, 0: 0}

到这个

{3: 4, 4: 3, 1: 2, 2: 1, 0: 0}

使用 a:b 模型,按最高 b 值排序

import operator

x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
sorted_x = sorted(x.items(), key=operator.itemgetter(1), reverse=True)

print(sorted_x)

第一个结果很好但是以列表形式:

[(3, 4), (4, 3), (1, 2), (2, 1), (0, 0)]

我试着

print(dict(sorted_x))

但是...

{0: 0, 1: 2, 2: 1, 3: 4, 4: 3}

如何保存正确的排序结果并将其转换为dict格式? 非常感谢你

UPD:

OrderedDict([(3, 4), (4, 3), (1, 2), (2, 1), (0, 0)])

我无法理解OrderedDict如何解决我的问题

2 个答案:

答案 0 :(得分:0)

字典无法订购。但您可以使用课程collections.OrderedDict

答案 1 :(得分:0)

>>> from collections import OrderedDict
>>> sorted_dict = OrderedDict()
>>> dct = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
>>> dct.values().sort()
>>> for x in sorted(dct.values(), reverse=True):
...     keys = [idx for idx in dct if dct[idx]==x]
...     for key in keys:
...         sorted_dict[key] = x
... 
>>> 
>>> sorted_dict
OrderedDict([(3, 4), (4, 3), (1, 2), (2, 1), (0, 0)])
>>> 

或者如果您已经开始编写类似于文件的dict语法的内容,

>>> def print_dict_looking_thing(ordered_dict):
...     print "{"
...     for key, value in ordered_dict.iteritems():
...         print "{0}: {1},".format(key, value)
...     print "}"
... 
>>> print_dict_looking_thing(sorted_dict)
{
3: 4,
4: 3,
1: 2,
2: 1,
0: 0,
}

这就是OrderedDict"如何解决你的问题"。但是,有几点值得再次强调:

  1. Dicts是无序的。你不能对它们进行排序"只能对它们的键和值进行操作。
  2. OrderedDicts记住添加项目的顺序。
  3. 听起来你正试图打印一个看起来像dict语法的文件。如果你这样做并在某个时候将dict读入python,它将再次成为无序对象(dict)
  4. 不清楚什么"你的问题"是。什么是期望的最终状态;打印一个读起来像dict语法的字符串?制作具有dicts的访问方法的东西?澄清你想要的东西(在性能方面)会有所帮助。
  5. 上面的代码具有O(n ** 2)复杂度。不要在大事上使用它。