我试图维护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"
}
不过,我使用的任何一种方式都不会保留此顺序。
答案 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'}
答案 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])