将 dict 转换为 OrderedDect

我在使用 collections.OrderedDict类时遇到了一些麻烦。我在 Raspbian 上使用 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)])

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

这是我在电脑上运行类似程序得到的结果:

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')])

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

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

191725 次浏览

您正在创建一个字典 第一,然后将该字典传递给 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 实现都必须遵循这种行为。有关详细信息,请参阅 我的另一个答案,以及为什么在某些情况下仍然需要使用 OrderedDict()

大多数时候,当我们需要一个自定义订单而不是像 ASC 这样的通用订单时,我们会使用 OrderedDect。

以下是建议的解决方案:

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)])

注意 : 新的排序字典在删除条目时保持它们的排序顺序。但是,当添加新键时,键被附加到末尾,并且不维护排序。(官方文件)

如果你不能编辑这部分的代码,你仍然可以在任何时候以任何你想要的方式编辑它,像这样:

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)

使用 dict.item () ; 它可以像下面这样简单:

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

您可以在一行中创建从旧授权词典的有序授权词典:

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

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