将dict转换为OrderedDi

2024-04-29 13:14:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我在使用collections.OrderedDict类时遇到了一些问题。我正在Raspbian上使用Python2.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版本。


Tags: nameimportage字典jobcollectionshpordereddict
3条回答

您首先要创建一个dictionary,然后将该dictionary传递给一个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()

如果无法编辑定义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)

大多数情况下,当我们需要定制订单而不是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)])

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

相关问题 更多 >