将dict转换为OrderedDict

pyt*_*boy 118 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)])
Run Code Online (Sandbox Code Playgroud)

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

这是我通过在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')])
Run Code Online (Sandbox Code Playgroud)

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

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

Mar*_*ers 191

首先创建一个字典,然后将该字典传递给OrderedDict.当你这样做时,订单不再是正确的.dict本来就没有订购.

传递一系列元组:

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

你打印时看到的OrderedDict是它的表示,它是完全正确的.OrderedDict([('PRICE', 250), ('HP', 50), ('NAME', 'Albatross'), ('BLASTERS', 13), ('THRUSTERS', 18)])只是以可重复的表示形式向您展示内容的内容OrderedDict.

  • 这种类型就像两者一样; 保留订单的映射.要创建一个订购,您需要按顺序给它*项*.由于标准的dict不能这样做,所以你给它一个元组列表.一旦'OrderedDict`被创建*它*是*一个字典. (7认同)
  • 听起来混乱来自于假设OrderedDict"应用"一个排序,而不仅仅是保留一个排序.我当然假设它会在创建时对输入进行排序 - 或者items()函数将返回已排序的项目,无论它们何时被插入.相反,它只保留您提供的任何订单. (3认同)
  • 问题:按照你所描述的方式,OrderedDict正在制作一个有序的"列表".这不是打败了目的吗?它只创建了一个元素列表,而不是带有键和值的字典...... (2认同)
  • @whiterook6:这不是 * 排序 * 字典编号。它是一个有序字典,一个记录键值对顺序并让您重新排序这些键值对的字典。将其与按 *sequences* 排序的列表进行比较。 (2认同)

Jan*_*cki 28

如果你无法编辑你的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)
Run Code Online (Sandbox Code Playgroud)


Abd*_*eed 9

大多数时候,当我们需要自定义订单而非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
Run Code Online (Sandbox Code Playgroud)

这将输出:

OrderedDict([('PRICE', 250), ('HP', 50), ('NAME', 'Albatross'), ('BLASTERS', 13), ('THRUSTERS', 18)])
OrderedDict([('NAME', 'Albatross'), ('HP', 50), ('BLASTERS', 13), ('THRUSTERS', 18), ('PRICE', 250)])
Run Code Online (Sandbox Code Playgroud)

注意:删除条目时,新排序的词典会保持其排序顺序.但是当添加新密钥时,密钥会附加到末尾,并且不会保留排序.(官方文档)


Ran*_*nty 6

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

from collections import OrderedDict
ordered_dict = OrderedDict(sorted(ship.items())
Run Code Online (Sandbox Code Playgroud)

默认排序键是按字典键排序,因此新字典ordered_dict按旧字典键排序。