我有一个字典,我以特定的顺序声明,并希望一直保持这个顺序。键/值不能根据它们的值来排列顺序,我只想让它按照我声明它的顺序排列。
如果我有字典
d = {'ac': 33, 'gw': 20, 'ap': 102, 'za': 321, 'bs': 10}
如果我查看或遍历它,它就不是这个顺序了。是否有任何方法确保Python将保持我声明键/值的显式顺序?
字典会使用一个让搜索更有效率的顺序,这是你无法改变的,
您可以只使用对象列表(在简单情况下是2元素元组,甚至是类),并将项附加到末尾。然后,您可以使用线性搜索在其中查找项目。
或者,您可以创建或使用为维护秩序而创建的不同数据结构。
一般来说,你可以设计一个行为类似于字典的类,主要实现方法__contains__, __getitem__, __delitem__, __setitem__等等。这个类可以有任何你喜欢的行为,例如在键上提供一个排序的迭代器……
__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或更高版本,那么你应该可以访问现在的标准collections.OrderedDict,在这个线程中其他人已经提供了许多例子。
collections.OrderedDict
注意,这个答案适用于python3.7之前的python版本。CPython 3.6在大多数情况下维护插入顺序作为实现细节。从Python3.7开始,已经声明实现必须保持插入顺序才能兼容。
Python字典是无序的。如果你想要一个有序字典,试试集合。OrderedDict。
注意,OrderedDict是在python 2.7中引入到标准库中的。如果你有一个较旧版本的python,你可以在ActiveState的上找到有序字典的菜谱。
from collections import OrderedDict OrderedDict((word, True) for word in words)
包含
OrderedDict([('He', True), ('will', True), ('be', True), ('the', True), ('winner', True)])
如果值是True(或任何其他不可变对象),你也可以使用:
True
OrderedDict.fromkeys(words, True)
如果你想要一个特定顺序的字典,你也可以创建一个列表的列表,其中第一项将是键,第二项将是值 就像这样 示例< / p >
>>> list =[[1,2],[2,3]] >>> for i in list: ... print i[0] ... print i[1] 1 2 2 3
当我试图弄清楚如何让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])
这有点麻烦,但我时间紧迫,这是我想出的变通办法。
注意:其他人建议的列表的列表方法对我来说并没有真正的意义,因为列表是有序和索引的(并且也是与字典不同的结构)。
我将给出一个简单的例子,而不是解释理论部分。
>>> 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}
你不能用字典做任何你想做的事。你已经有了字典d = {'ac':33, 'gw':20, 'ap':102, 'za':321, 'bs':10}created。我发现一旦它已经创建,就没有办法保持秩序。我所做的是用对象创建一个json文件:
d = {'ac':33, 'gw':20, 'ap':102, 'za':321, 'bs':10}
{"ac":33,"gw":20,"ap":102,"za":321,"bs":10}
我使用:
r = json.load(open('file.json'), object_pairs_hook=OrderedDict)
然后使用:
print json.dumps(r)
来验证。
从Python 3.6开始,标准dict类型默认保持插入顺序。
dict
定义
将生成一个字典,其中键按源代码中列出的顺序排列。
这是通过为稀疏哈希表使用一个简单的整数数组来实现的,其中这些整数索引到另一个数组中,该数组存储键-值对(加上计算的哈希)。后一个数组恰好按插入顺序存储项,整个组合实际上比Python 3.5及以前版本中使用的实现使用更少的内存。详见Raymond Hettinger的原创观点。
在3.6中,这仍然被认为是一个实现细节;参见 Python 3.6新增功能文档:
这个新实现的顺序保持方面被认为是一个实现细节,不应该被依赖(这在未来可能会改变,但在改变语言规范以强制所有当前和未来的Python实现保持顺序语义之前,希望在几个版本中有这个新的dict实现;这也有助于保持与旧版本语言的向后兼容性,其中随机迭代顺序仍然有效,例如Python 3.5)。
Python 3.7将这个实现细节提升为语言规范,因此现在强制要求dict在所有与该版本或更新版本兼容的Python实现中保持顺序。参见BDFL的公告。从Python 3.8开始,字典也支持反向迭代。
在某些情况下,你可能仍然想使用collections.OrderedDict()类,因为它在标准dict类型之上提供了一些额外的功能。例如是可逆的(这扩展到视图对象),并支持重排序(通过move_to_end()方法)。
collections.OrderedDict()
move_to_end()
你可以做和我为字典做的一样的事情。
创建一个列表和空字典:
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
另一种替代方法是使用Pandas dataframe,因为它保证了类字典结构中项的顺序和索引位置。
dataframe
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')])