Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何保持键/值与声明的顺序相同?_Python_Sorting_Dictionary - Fatal编程技术网

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')])