将字典转换为 OrderedDict

问题描述 投票:0回答:6

我在使用

collections.OrderedDict
课程时遇到了一些问题。我在 Raspbian 上使用 Python 2.7,Raspbian 是 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')])

这次是正常的,不过应该不会打印其他东西吧? (将其放入列表并显示函数调用。)

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

python ordereddictionary
6个回答
237
投票

你正在创建一个字典first,然后将该字典传递给一个

OrderedDict
。对于 Python 版本 < 3.6 (*),当您这样做时,顺序将不再正确。
dict
本质上是不有序的。

传递一个元组序列:

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

当你打印

OrderedDict
时你看到的是它的representation,它是完全正确的。
OrderedDict([('PRICE', 250), ('HP', 50), ('NAME', 'Albatross'), ('BLASTERS', 13), ('THRUSTERS', 18)])
只是以 reproducable 表示形式向您展示
OrderedDict
.

的内容

(*):在 CPython 3.6 实现中,

dict
类型已更新为使用内存效率更高的内部结构,该结构具有保留插入顺序的快乐副作用,并且通过扩展问题中显示的代码无需问题。从 Python 3.7 开始,Python 语言规范 已更新,要求所有 Python 实现都必须遵循此行为。有关详细信息,请参阅我的另一个答案以及为什么您仍然可能希望在某些情况下使用
OrderedDict()


40
投票

如果您无法编辑定义字典的这部分代码,您仍然可以随时以任何您想要的方式对其进行排序,如下所示:

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)

12
投票

大多数时候,当我们需要自定义订单而不是像 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


6
投票

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

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

默认的排序键是字典键,所以新的

ordered_dict
是按旧字典的键排序的。


0
投票

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

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

0
投票

希望这可以作为替代答案。干杯!


import collections

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

# unsequenced key value pair in the dict
print ship

# before using inherent dict for creating an OrderedDict
print collections.OrderedDict(ship)
# OrderedDict([('PRICE', 250), ('HP', 50), ('NAME', 'Albatross'), ('BLASTERS', 13), ('THRUSTERS', 18)])

list_key = ["NAME","HP","BLASTERS","THRUSTERS","PRICE"]
ordered_list = [(key,ship[key]) for key in list_key]
ordered_ship = collections.OrderedDict(ordered_list)

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

© www.soinside.com 2019 - 2024. All rights reserved.