Python 如何保持键/值与声明的顺序相同?
我有一本字典,我是按照特定的顺序声明的,我想一直保持它的顺序。键/值不能根据它们的值按顺序保存,我只希望它按我声明的顺序保存 如果我有字典:Python 如何保持键/值与声明的顺序相同?,python,sorting,dictionary,Python,Sorting,Dictionary,我有一本字典,我是按照特定的顺序声明的,我想一直保持它的顺序。键/值不能根据它们的值按顺序保存,我只希望它按我声明的顺序保存 如果我有字典: d = {'ac': 33, 'gw': 20, 'ap': 102, 'za': 321, 'bs': 10} dictionary_items = {} fields = [['Name', 'Himanshu Kanojiya'], ['email id', 'hima@gmail.com']] l = fields[0][0] m = field
d = {'ac': 33, 'gw': 20, 'ap': 102, 'za': 321, 'bs': 10}
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
如果我查看或遍历它,它的顺序不是这样的,有没有办法确保Python将保持我在中声明的键/值的显式顺序?字典将使用一种使搜索效率更高的顺序,而您不能更改这种顺序 您可以只使用一个对象列表(简单情况下是一个2元素元组,甚至是一个类),并在末尾附加项。然后可以使用线性搜索来查找其中的项目
或者,您可以创建或使用为维护秩序而创建的不同数据结构。通常,您可以设计一个行为类似于字典的类,主要是实现方法
\uuuu contains\uuuuuuuu
、\uu getitem\uuuuuuuuuu
、\uuuuu setitem\uuuuuuuuuu
等。该类可以有您喜欢的任何行为,例如,在键上使用排序迭代器…我在开发Django项目时遇到了类似的问题。我无法使用OrderedDict,因为我运行的是旧版本的python,所以解决方案是使用Django的SortedDict类:
e、 g
注:此答案最初来自2011年。如果您可以访问Python版本2.7或更高版本,那么您应该可以访问现在标准的
集合.OrderedDict
,其中许多示例已由本线程中的其他人提供。请注意,此答案适用于Python版本3.7之前的Python版本。在大多数情况下,CPython 3.6将插入顺序作为实现细节进行维护。从Python3.7开始,已经声明实现必须保持插入顺序才能兼容。
python字典是无序的。如果你想要一本有序的字典,试试看 请注意,OrderedDict是在python 2.7中引入标准库的。如果您有较旧版本的python,您可以在上找到有序字典的配方 包含
OrderedDict([('He', True), ('will', True), ('be', True), ('the', True), ('winner', True)])
如果值为True
(或任何其他不可变对象),则还可以使用:
OrderedDict.fromkeys(words, True)
如果希望字典按特定顺序排列,还可以创建列表列表,其中第一项为键,第二项为值 看起来像这样 范例
我是在试图弄清楚如何订购信息通信技术时发现这篇文章的。PyDev for Eclipse根本找不到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])
这有点麻烦,但我时间紧迫,这是我想出的解决办法
注意:其他人建议的列表方法对我来说并没有真正意义,因为列表是有序的和索引的(也是与字典不同的结构)。我将给出一个简单的例子,而不是解释理论部分
>>> 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}
。我发现一旦它被创建,就没有办法保持秩序。我所做的是用对象生成一个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)
为了验证。从Python 3.6开始,标准的
dict
类型默认保持插入顺序
定义
d = {'ac':33, 'gw':20, 'ap':102, 'za':321, 'bs':10}
将生成一个字典,其中的键按源代码中列出的顺序排列
这是通过为稀疏哈希表使用一个带有整数的简单数组实现的,这些整数索引到另一个存储键值对(加上计算出的哈希)的数组中。后一个数组恰好以插入顺序存储项,整个组合实际上使用的内存比Python3.5及之前版本中使用的实现要少。有关详细信息,请参阅
在3.6中,这仍然被视为实施细节;见:
这个新实现的顺序保持方面被认为是一个实现细节,不应该依赖它(这在将来可能会发生变化,但在将语言规范更改为所有当前和未来Python实现的命令保留语义之前,希望在一些版本中使用这种新的dict实现;这也有助于保持与旧版本的语言的向后兼容性,其中随机迭代离子顺序仍然有效,例如Python 3.5)
Python 3.7将此实现细节提升为语言规范,因此现在必须dict
在与该版本或更高版本兼容的所有Python实现中保留顺序。请参阅。从Python 3.8开始,字典也支持
在某些情况下,您可能仍然希望使用,因为它在标准
dict
类型的基础上提供了一些附加功能。例如,being(扩展到)和支持重新排序(通过)。您可以做与我在dictionary中做的相同的事情
创建列表和空字典:
d = {'ac': 33, 'gw': 20, 'ap': 102, 'za': 321, 'bs': 10}
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,因为它保证了类似dict的结构中项目的顺序和索引位置。当然,值得注意的是,“不可变”部分并不是Python将强制执行的硬性规则-它“唯一”是一个好主意。请注意:
OrderedDict(FUTURE=[],TODAY=[],pass=[])等解决方案
在提到以下方法时不起作用:OrderedICT([('FUTURE',[])、('TODAY',[])、('PAST',等等,
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')])
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')])