我有一个字典,我按特定顺序声明了它,想要一直保持这个顺序。键/值不能根据它们的值进行排序,我只是想按照我声明它的顺序排列。
所以如果我有以下字典:
d = {'ac': 33, 'gw': 20, 'ap': 102, 'za': 321, 'bs': 10}
如果我查看它或遍历它,它不是按照那个顺序排列的。有没有办法确保Python会保持我声明键/值对的显式顺序?
我有一个字典,我按特定顺序声明了它,想要一直保持这个顺序。键/值不能根据它们的值进行排序,我只是想按照我声明它的顺序排列。
所以如果我有以下字典:
d = {'ac': 33, 'gw': 20, 'ap': 102, 'za': 321, 'bs': 10}
如果我查看它或遍历它,它不是按照那个顺序排列的。有没有办法确保Python会保持我声明键/值对的显式顺序?
dict
类型默认按插入顺序维护元素。d = {'ac':33, 'gw':20, 'ap':102, 'za':321, 'bs':10}
Python 3.7将此实现细节提升为语言规范,因此在与该版本或更高版本兼容的所有Python实现中,dict
现在必须保留顺序。请参阅BDFL的声明。从Python 3.8开始,字典还支持反向迭代。
在某些情况下,您可能仍然希望使用collections.OrderedDict()
类,因为它在标准dict
类型之上提供了一些额外的功能。例如可以反转(这也适用于view对象),并支持重新排序(通过move_to_end()
方法)。
iter(dictview)
下):键和值按插入顺序迭代和字典顺序保证是插入顺序。 - Martijn Pietersfrom 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',[])])
将保持顺序。 - andilabs不解释理论部分,我来举一个简单的例子。
>>> 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
确实解决了这个问题,但在这个特定的例子中,使用标准字典可以得到完全相同的结果。 - Tonechas{'aol': 1, 'foo': 3}
,所以我认为这是一个很好的说明性示例。 - twasbrilligOrderedDict.update()
方法:d1.upate([(key1, val1), (key2, val2)])
。 - Ruud AlthuizenPython字典是无序的。 如果您想要一个有序的字典,请尝试使用collections.OrderedDict。
请注意,OrderedDict是在python 2.7中引入到标准库中的。 如果您有较旧版本的python,则可以在ActiveState上找到有序字典的配方。
字典会使用一种使搜索更高效的顺序,您无法更改它。
您可以使用对象列表(在简单情况下是一个 2 元素元组,甚至是一个类),并将项目附加到末尾。之后,您可以使用线性搜索在其中查找项目。
或者,您可以创建或使用意图维护顺序的不同数据结构。
使用字典无法实现您想要的功能。您已经创建了字典 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)
验证。
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])
这个方法有点繁琐,但是我时间紧迫,这是我想到的解决办法。
注意:其他人建议的列表套列表方法对我来说并不太合适,因为列表是有序且索引的(而且也与字典结构不同)。
from collections import OrderedDict
list1 = ['k1', 'k2']
list2 = ['v1', 'v2']
new_ordered_dict = OrderedDict(zip(list1, list2))
print new_ordered_dict
# OrderedDict([('k1', 'v1'), ('k2', 'v2')])
在开发Django项目时,我遇到了类似的问题。由于我使用的是旧版本的python,无法使用OrderedDict,所以解决方案是使用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
collections.OrderedDict
,其他人在本帖中提供了许多示例。