将 dict 转换为 OrderedDict

2025-02-27 09:06:00
admin
原创
62
摘要:问题描述:我在使用该类时遇到了一些麻烦collections.OrderedDict。我在 Raspbian(Raspberry Pi 的 Debian 发行版)上使用 Python 2.7。我试图按顺序打印两个字典,以便进行比较(并排),以进行文本冒险。顺序对于准确比较至关重要。无论我如何尝试,字典都会以通...

问题描述:

我在使用该类时遇到了一些麻烦collections.OrderedDict。我在 Raspbian(Raspberry Pi 的 Debian 发行版)上使用 Python 2.7。我试图按顺序打印两个字典,以便进行比较(并排),以进行文本冒险。顺序对于准确比较至关重要。无论我如何尝试,字典都会以通常的无序方式打印。

这是我在 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 版本。


解决方案 1:

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

解决方案 2:

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

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)

解决方案 3:

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

注意:删除条目时,新排序的字典将保持其排序顺序。但是,添加新键时,键将附加到末尾,并且不会保持排序。(官方文档)

解决方案 4:

您可以用一行代码从旧字典创建有序字典:

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

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

解决方案 5:

使用dict.items();可以简单如下:

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

解决方案 6:

希望这可以作为另一种答案。干杯!


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

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   3817  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   2697  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Freshdesk、ClickUp、nTask、Hubstaff、Plutio、Productive、Targa、Bonsai、Wrike。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在项目管理过程中面临着诸多痛点,如任务分配不...
项目管理系统   0  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Monday、TeamGantt、Filestage、Chanty、Visor、Smartsheet、Productive、Quire、Planview。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多项目经理和团队在管理复杂项目时,常...
开源项目管理工具   0  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Smartsheet、GanttPRO、Backlog、Visor、ResourceGuru、Productive、Xebrio、Hive、Quire。在当今快节奏的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在选择项目管理工具时常常面临困惑:...
项目管理系统   0  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用