我有一个字典,我以特定的顺序声明,并希望一直保持这个顺序。键/值不能根据它们的值来排列顺序,我只想让它按照我声明它的顺序排列。
如果我有字典
d = {'ac': 33, 'gw': 20, 'ap': 102, 'za': 321, 'bs': 10}
如果我查看或遍历它,它就不是这个顺序了。是否有任何方法确保Python将保持我声明键/值的显式顺序?
我有一个字典,我以特定的顺序声明,并希望一直保持这个顺序。键/值不能根据它们的值来排列顺序,我只想让它按照我声明它的顺序排列。
如果我有字典
d = {'ac': 33, 'gw': 20, 'ap': 102, 'za': 321, 'bs': 10}
如果我查看或遍历它,它就不是这个顺序了。是否有任何方法确保Python将保持我声明键/值的显式顺序?
当前回答
字典会使用一个让搜索更有效率的顺序,这是你无法改变的,
您可以只使用对象列表(在简单情况下是2元素元组,甚至是类),并将项附加到末尾。然后,您可以使用线性搜索在其中查找项目。
或者,您可以创建或使用为维护秩序而创建的不同数据结构。
其他回答
注意,这个答案适用于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)
来验证。
另一种替代方法是使用Pandas数据框架,因为它保证了类字典结构中条目的顺序和索引位置。
字典会使用一个让搜索更有效率的顺序,这是你无法改变的,
您可以只使用对象列表(在简单情况下是2元素元组,甚至是类),并将项附加到末尾。然后,您可以使用线性搜索在其中查找项目。
或者,您可以创建或使用为维护秩序而创建的不同数据结构。
当我试图弄清楚如何让OrderedDict工作时,我偶然发现了这篇文章。PyDev for Eclipse根本找不到OrderedDict,所以我最终决定用字典的键值创建一个元组,因为我希望它们是有序的。当我需要输出我的列表时,我只是遍历元组的值,并将元组中的迭代'key'插入字典中,以按照我需要的顺序检索我的值。
例子:
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])
这有点麻烦,但我时间紧迫,这是我想出的变通办法。
注意:其他人建议的列表的列表方法对我来说并没有真正的意义,因为列表是有序和索引的(并且也是与字典不同的结构)。