将dict转换为OrderedDict

时间:2013-03-29 21:35:00

标签: python ordereddictionary

我在使用collections.OrderedDict课时遇到了一些麻烦。我在Raspberry上使用Python 2.7,这是Raspberry Pi的Debian发行版。我正在尝试打印两个词典,以便进行文本冒险的比较(并排)。订单对于准确比较至关重要。 无论我怎样尝试用他们通常无序的方式打印字典。

这是我在RPi上做的事情:

import collections

ship = {"NAME": "Albatross",
         "HP":50,
         "BLASTERS":13,
         "THRUSTERS":18,
         "PRICE":250}

ship = collections.OrderedDict(ship)

print ship
# OrderedDict([('PRICE', 250), ('HP', 50), ('NAME', 'Albatross'), ('BLASTERS', 13), ('THRUSTERS', 18)])

显然有些东西不对,因为它正在打印函数调用并将键和值组放入嵌套列表中......

这就是我在PC上运行类似的东西所得到的:

import collections

Joe = {"Age": 28, "Race": "Latino", "Job": "Nurse"}
Bob = {"Age": 25, "Race": "White", "Job": "Mechanic", "Random": "stuff"}

#Just for clarity:
Joe = collections.OrderedDict(Joe)
Bob = collections.OrderedDict(Bob)

print Joe
# OrderedDict([('Age', 28), ('Race', 'Latino'), ('Job', 'Nurse')])
print Bob
# OrderedDict([('Age', 25), ('Race', 'White'), ('Job', 'Mechanic'), ('Random', 'stuff')])

这一次,它是有序的,但它不应该打印其他东西虽然对吗? (将其放入列表并显示函数调用。)

我在哪里犯错误?它不应该与pi版本的Python有任何关系,因为它只是Linux版本。

5 个答案:

答案 0 :(得分:179)

您正在创建字典 first ,然后将该字典传递给OrderedDict。对于Python版本< 3.6 (*),当你这样做时,排序不再正确。 dict本来就没有订购。

传递一系列元组:

ship = [("NAME", "Albatross"),
        ("HP", 50),
        ("BLASTERS", 13),
        ("THRUSTERS", 18),
        ("PRICE", 250)]
ship = collections.OrderedDict(ship)

打印OrderedDict时看到的是表示,这是完全正确的。 OrderedDict([('PRICE', 250), ('HP', 50), ('NAME', 'Albatross'), ('BLASTERS', 13), ('THRUSTERS', 18)])只是以可再现的表示形式向您显示OrderedDict的内容。


(*):在CPython 3.6实现中,dict类型已更新为使用内存效率更高的内部结构,它具有保留插入顺序的快乐副作用,并且扩展问题中显示的代码没有问题。从Python 3.7开始, Python语言规范已经更新,要求所有Python实现必须遵循此行为。有关详细信息,请参阅this other answer of mine,以及为什么您仍可能希望在某些情况下使用OrderedDict()

答案 1 :(得分:21)

如果您无法编辑定义dict的代码部分,您仍然可以按照您想要的任何方式订购它,例如:

from collections import OrderedDict

order_of_keys = ["key1", "key2", "key3", "key4", "key5"]
list_of_tuples = [(key, your_dict[key]) for key in order_of_keys]
your_dict = OrderedDict(list_of_tuples)

答案 2 :(得分:8)

当我们需要自定义订单而非ASC等通用订单时,我们大部分时间都会使用OrderedDict。

以下是建议的解决方案:

import collections
ship = {"NAME": "Albatross",
         "HP":50,
         "BLASTERS":13,
         "THRUSTERS":18,
         "PRICE":250}

ship = collections.OrderedDict(ship)

print ship


new_dict = collections.OrderedDict()
new_dict["NAME"]=ship["NAME"]
new_dict["HP"]=ship["HP"]
new_dict["BLASTERS"]=ship["BLASTERS"]
new_dict["THRUSTERS"]=ship["THRUSTERS"]
new_dict["PRICE"]=ship["PRICE"]


print new_dict

这将输出:

OrderedDict([('PRICE', 250), ('HP', 50), ('NAME', 'Albatross'), ('BLASTERS', 13), ('THRUSTERS', 18)])
OrderedDict([('NAME', 'Albatross'), ('HP', 50), ('BLASTERS', 13), ('THRUSTERS', 18), ('PRICE', 250)])

注意:删除条目时,新排序的词典会保持其排序顺序。但是,当添加新密钥时,密钥将附加到结尾,并且不会保留排序。(official doc

答案 3 :(得分:2)

您可以在一行中从旧字典创建有序字典:

from collections import OrderedDict
ordered_dict = OrderedDict(sorted(ship.items())

默认的排序键是字典键,所以新的 ordered_dict 是按旧字典的键排序的。

答案 4 :(得分:0)

使用dict.items();它可以很简单,如下所示:

ship = collections.OrderedDict(ship.items())