我有一个字典,我以特定的顺序声明,并希望一直保持这个顺序。键/值不能根据它们的值来排列顺序,我只想让它按照我声明它的顺序排列。

如果我有字典

d = {'ac': 33, 'gw': 20, 'ap': 102, 'za': 321, 'bs': 10}

如果我查看或遍历它,它就不是这个顺序了。是否有任何方法确保Python将保持我声明键/值的显式顺序?


当前回答

一般来说,你可以设计一个行为类似于字典的类,主要实现方法__contains__, __getitem__, __delitem__, __setitem__等等。这个类可以有任何你喜欢的行为,例如在键上提供一个排序的迭代器……

其他回答

在开发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或更高版本,那么你应该可以访问现在的标准集合。OrderedDict,在这个帖子中其他人已经提供了许多例子。

另一种替代方法是使用Pandas数据框架,因为它保证了类字典结构中条目的顺序和索引位置。

一般来说,你可以设计一个行为类似于字典的类,主要实现方法__contains__, __getitem__, __delitem__, __setitem__等等。这个类可以有任何你喜欢的行为,例如在键上提供一个排序的迭代器……

注意,这个答案适用于python3.7之前的python版本。CPython 3.6在大多数情况下维护插入顺序作为实现细节。从Python3.7开始,已经声明实现必须保持插入顺序才能兼容。


Python字典是无序的。如果你想要一个有序的字典,试试collections.OrderedDict。

注意,OrderedDict是在python 2.7中引入到标准库中的。如果你有一个较旧版本的python,你可以在ActiveState上找到有序字典的菜谱。

你不能用字典做任何你想做的事。您已经创建了字典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)

来验证。