Python 将dict转换为OrderedDict

Python 将dict转换为OrderedDict,python,ordereddictionary,Python,Ordereddictionary,我在使用collections.OrderedDict类时遇到一些问题。我正在Raspbian上使用Python 2.7,Raspberry Pi的Debian发行版。我正试图打印两本字典,以便在文本冒险中(并排)进行比较。顺序对于准确比较至关重要。 不管我怎么努力,字典都是以通常的无序方式打印出来的 以下是我在RPi上执行此操作时得到的结果: import collections ship = {"NAME": "Albatross", "HP":50,

我在使用
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的pi版本有任何关系,因为它只是Linux版本。

您首先要创建一个字典,然后将该字典传递给一个
orderedict
。对于<3.6(*)的Python版本,当您这样做时,顺序将不再正确
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),('Purchers',18)])
以可复制的形式向您展示了
OrderedDict
的内容



(*):在CPython 3.6实现中,
dict
类型被更新为使用内存效率更高的内部结构,该结构具有保留插入顺序的良好副作用,并且通过扩展,问题中显示的代码可以正常工作。从Python3.7开始,Python语言规范已经更新,要求所有Python实现都必须遵循此行为。请参阅以了解详细信息,以及为什么在某些情况下您可能仍然希望使用
OrderedICT()

大多数情况下,当我们需要定制订单而不是像ASC等一般订单时,我们会选择OrderedICT

以下是建议的解决方案:

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

注意:删除条目时,新的已排序词典将保持其排序顺序。但是当添加新的键时,键会附加到末尾,并且排序不会被维护。(

如果您无法编辑定义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)
使用dict.items();它可以简单地如下所示:

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

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

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

默认的排序键是按字典键,因此新的
ordered\u dict
是按旧的dict键排序的。

Ok,那么OrderedDict会为我创建字典吗?另外,如果要打印而不使用可复制表示,我可以只打印中使用的变量OrderedDict吗?i、 e.:
打印发货
??谢谢:)问题:按照您描述的方式,OrderedDict正在制作一个有序的“列表”。这不是违背了目的吗?它只是创建一个元素列表,而不是带有键和值的字典……类型的行为类似于两者;保持顺序的映射。要创建一个有顺序的项目,您需要按顺序为其指定项目。因为标准dict(在PyPI或python3.6+之外的任何东西上)不能做到这一点,所以您可以给它一个元组列表。一旦创建了
OrderedDict
,它就是一本字典。听起来,混淆之处在于假设OrderedDict“应用”了一个顺序,而不仅仅是保留了一个顺序。我当然认为它会在创建时对输入进行排序——或者items()函数会返回排序后的项,而不管它们是何时插入的。相反,它只保留您提供的任何顺序。@whiterook6:它不是一个排序字典否。它是一个排序字典,一个记录键值对顺序并允许您重新排序这些对的字典。将此与列表进行比较,列表是按顺序排列的。注意:
OrderedDict
是按插入顺序排列的,而不是按字母数字键顺序排列的。实际上,ship.items()不是按顺序排列的。您只需打印ship.items()即可进行检查