如何在Python中创建OrderedDict?

时间:2017-07-15 05:48:54

标签: python dictionary

我试图维护Python字典的顺序,因为原生dict没有任何顺序。 SE中的许多答案建议使用OrderedDict

from collections import OrderedDict

domain1 = { "de": "Germany", "sk": "Slovakia", "hu": "Hungary",
    "us": "United States", "no": "Norway"  }

domain2 = OrderedDict({ "de": "Germany", "sk": "Slovakia", "hu": "Hungary",
    "us": "United States", "no": "Norway"  })

print domain1
print " "    
for key,value in domain1.iteritems():
    print (key,value)

print " "

print domain2
print ""
for key,value in domain2.iteritems():
    print (key,value)

迭代后,我需要字典来维护其原始顺序并将键和值打印为原始字典:

{
    "de": "Germany",
    "sk": "Slovakia",
    "hu": "Hungary",
    "us": "United States",
    "no": "Norway"
}

不过,我使用的任何一种方式都不会保留此顺序。

4 个答案:

答案 0 :(得分:12)

您需要按顺序传递一系列项目或插入项目 - 这就是它如何知道订单。尝试这样的事情:

from collections import OrderedDict

domain = OrderedDict([('de', 'Germany'),
                      ('sk', 'Slovakia'),
                      ('hu', 'Hungary'),
                      ('us', 'United States'),
                      ('no', 'Norway')])

数组有一个订单,因此OrderedDict将知道你想要的订单。

答案 1 :(得分:2)

OrderedDict的情况下,您将在传递给构造函数之前创建一个中间的,常规的(因此无序的)字典。为了保持顺序,你要么必须将带有顺序的东西传递给构造函数(例如元组列表),要么按照你想要的顺序逐个添加键(可能是循环)。

答案 2 :(得分:1)

最新答案,但这是python 3.6+sort词典的key ,不使用导入:

d = { "de": "Germany", "sk": "Slovakia", "hu": "Hungary",
    "us": "United States", "no": "Norway"  }
d_sorted = {k: v for k, v in sorted(d.items(), key=lambda x: x[1])}
print(d_sorted)

输出:

{'de': 'Germany', 'hu': 'Hungary', 'no': 'Norway', 'sk': 'Slovakia', 'us': 'United States'}

Python Demo

答案 3 :(得分:0)

您可以使用OrderedDict,但必须考虑到OrderedDict在您正在运行的代码之外无效。

这意味着将对象导出为JSON将失去OrderedDict的所有效果。

您可以做的是创建一个元数据数组,您可以在其中以有序的方式存储键"de", sk", etc.。通过按顺序浏览数组,您可以正确地引用字典,并且数组中的顺序将在JSON,YAML等中的任何导出中继续存在。

当前JSON:

{ "de": "Germany", "sk": "Slovakia", "hu": "Hungary", "us": "United States", "no": "Norway"  }

新对象countries

countries = {
  "names" : { 
    "de": "Germany", "sk": "Slovakia", "hu": "Hungary", "us": "United States", "no": "Norway"  
  },
  "order" : [ 
    "de", "sk", "hu", "us", "no" 
  ]
}

将按顺序打印长名称的代码:

for code in countries['order']:
 print(countries['names'][code])