Answers:
从Python 3.6开始,标准dict
类型默认会保留插入顺序。
定义
d = {'ac':33, 'gw':20, 'ap':102, 'za':321, 'bs':10}
将产生字典,其中的键按源代码中列出的顺序排列。
这是通过将一个带有整数的简单数组用于稀疏哈希表来实现的,其中这些整数索引到另一个存储键值对(加上计算得出的哈希值)的数组中。后面的数组恰好按插入顺序存储项目,实际上,整个组合使用的内存少于Python 3.5及之前版本中使用的实现。有关详细信息,请参阅Raymond Hettinger的原始想法帖子。
在3.6中,这仍被视为实现细节;请参阅Python 3.6文档的新增功能:
此新实现的顺序保留方面被认为是实现细节,因此不应依赖(将来可能会更改,但是希望在更改语言规范之前,先在几个版本中使用该新dict实现该语言,为所有当前和将来的Python实现强制要求保留顺序的语义;这还有助于保留与仍旧有效的随机迭代顺序的旧版本语言(例如Python 3.5)的向后兼容性。
Python 3.7将此实现细节提升为语言规范,因此现在必须dict
保留与该版本或更高版本兼容的所有Python实现中的顺序。参见BDFL的声明。
在某些情况下,您可能仍想使用collections.OrderedDict()
该类,因为它在标准dict
类型的基础上提供了一些附加功能。例如是可逆的(这扩展到视图对象),并支持重新排序(通过move_to_end()
方法)。
from collections import OrderedDict
OrderedDict((word, True) for word in words)
包含
OrderedDict([('He', True), ('will', True), ('be', True), ('the', True), ('winner', True)])
如果值是True
(或任何其他不可变对象),则还可以使用:
OrderedDict.fromkeys(words, True)
OrderedDict(FUTURE=[], TODAY=[], PAST=[])
无效)在提OrderedDict([('FUTURE', []), ('TODAY', []), ('PAST', [])])
及时会失效:将保持秩序。
我不会解释理论部分,而是给出一个简单的示例。
>>> from collections import OrderedDict
>>> my_dictionary=OrderedDict()
>>> my_dictionary['foo']=3
>>> my_dictionary['aol']=1
>>> my_dictionary
OrderedDict([('foo', 3), ('aol', 1)])
>>> dict(my_dictionary)
{'foo': 3, 'aol': 1}
OrderedDict
确实解决了问题,但是...在此特定示例中,使用标准字典可获得完全相同的结果
{'aol': 1, 'foo': 3}
所以我觉得这是一个很好的说明性例子。
OrderedDict.update()
使用包含键值对的可迭代对象进行调用:d1.upate([(key1, val1), (key2, val2)])
。
请注意,此答案适用于python3.7之前的python版本。CPython 3.6在大多数情况下都将插入顺序作为实现细节来维护。从Python3.7开始,已经声明实现必须维护插入顺序以使其兼容。
python字典是无序的。如果需要有序字典,请尝试collections.OrderedDict。
注意,OrderedDict是在python 2.7中引入的标准库。如果您使用的是python的旧版本,则可以在ActiveState上找到有序词典的食谱。
我在尝试弄清楚如何使OrderedDict工作时遇到了这篇文章。用于Eclipse的PyDev根本找不到OrderedDict,所以我最终决定根据字典的键值创建一个元组,因为我希望对它们进行排序。当我需要输出列表时,我只需遍历元组的值,然后将元组中迭代的“键”插入字典中,即可按需要的顺序检索值。
例:
test_dict = dict( val1 = "hi", val2 = "bye", val3 = "huh?", val4 = "what....")
test_tuple = ( 'val1', 'val2', 'val3', 'val4')
for key in test_tuple: print(test_dict[key])
这有点麻烦,但是我时间紧迫,这是我想出的解决方法。
注意:其他人建议的列表列表方法对我来说真的没有意义,因为列表是有序的和索引的(并且结构与字典不同)。
您实际上无法使用字典来完成所需的工作。您已经d = {'ac':33, 'gw':20, 'ap':102, 'za':321, 'bs':10}
创建了词典。我发现一旦创建就无法保持秩序。我所做的是用对象制作了一个json文件:
{"ac":33,"gw":20,"ap":102,"za":321,"bs":10}
我用了:
r = json.load(open('file.json'), object_pairs_hook=OrderedDict)
然后使用:
print json.dumps(r)
核实。
一般情况下,你可以设计一个类,像一本字典的行为,主要是实现方法__contains__
,__getitem__
,__delitem__
,__setitem__
和更多一些。该类可以具有您喜欢的任何行为,例如,对键使用排序的迭代器...
如果您希望按特定顺序拥有字典,则还可以创建一个列表列表,其中第一项为键,第二项为值,看起来像此示例
>>> list =[[1,2],[2,3]]
>>> for i in list:
... print i[0]
... print i[1]
1
2
2
3
开发Django项目时遇到类似的问题。我无法使用OrderedDict,因为我正在运行旧版本的python,因此解决方案是使用Django的SortedDict类:
https://code.djangoproject.com/wiki/SortedDict
例如,
from django.utils.datastructures import SortedDict
d2 = SortedDict()
d2['b'] = 1
d2['a'] = 2
d2['c'] = 3
注意:此答案最初来自2011年。如果您可以访问python 2.7或更高版本,则应该可以访问现在的standard collections.OrderedDict
,该线程中的其他示例已经提供了其中的很多示例。
您可以做与字典一样的事情。
创建一个列表并清空字典:
dictionary_items = {}
fields = [['Name', 'Himanshu Kanojiya'], ['email id', 'hima@gmail.com']]
l = fields[0][0]
m = fields[0][1]
n = fields[1][0]
q = fields[1][1]
dictionary_items[l] = m
dictionary_items[n] = q
print dictionary_items