普通字典和 OrderedDictonary 的语法差异

Difference in syntax of a normal dictionary and OrderedDictonary

打印普通字典的语法是

{'a': 1, 'c': 3, 'b': 2}

鉴于

打印 OrderedDict 的语法是

OrderedDict([('a', 1), ('b', 2), ('c', 3)])

有什么方法可以print/return OrderedDict 的普通字典方式吗??

在您自己的 OrderedDict class 中使用自定义 __str__ 方法;在自定义方法中,你可以构建你想要的字符串:

from collections import OrderedDict

class MyOrderedDict(OrderedDict):
   def __str__(self):
      return "{%s}" % ", ".join([repr(k)+": "+str(v) for k, v in self.iteritems()])

d = MyOrderedDict([('a', 1), ('b', 2), ('c', 3)])

要以 dict 方式打印 OrderedDict,您可以这样做(当然,如果打印的项目的实际顺序无关紧要):

def some_function():
    d = {'banana': 3, 'apple': 4, 'pear': 1, 'orange': 2}
    od = OrderedDict(sorted(d.items(), key=lambda t: t[0]))
    return od

my_ordered_dict_variable = some_function()
print('My Ordered Dicdict:', dict(my_ordered_dict_variable))

此代码将打印:

{'banana': 3, 'apple': 4, 'pear': 1, 'orange': 2}

简单的方法:

from collections import OrderedDict

a = {'a': 1, 'c': 3, 'b': 2}
new_dict = dict(OrderedDict(a))
print(new_dict)
print(type(new_dict))

输出:

{'a': 1, 'c': 3, 'b': 2}
<type 'dict'>

困难的方法:

您还可以使用 itertools 模块中的 groupby 将 OrderedDict return 转换为简单的字典,如下所示:

from collections import OrderedDict
from itertools import groupby
a = {'a': 1, 'c': 3, 'b': 2}

new_dict = {key:list(val)[0][1] for key, val in groupby(OrderedDict(a).items(), lambda x : x[0])}
print(new_dict)
print(type(new_dict))

输出:

{'c': 3, 'a': 1, 'b': 2`}
<type 'dict'>

编辑:

我看到有人反对,因为他们认为输出应该是有序字符串。所以,这是如何处理它的:

from collections import OrderedDict

a = {'a': 1, 'c': 3, 'b': 2}
new_dict = OrderedDict(a)

b = "{%s}" % ", ".join([str(key)+":"+str(val) for key, val in sorted(new_dict.iteritems())])

print(b)
print(type(b))

输出:

{'a':1, 'b':2, 'c':3}
<type 'str'>