Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.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 - Fatal编程技术网

为什么python字典键是这样的?

为什么python字典键是这样的?,python,Python,我有一本字典: dict_a = dict(zip(('a','b','c','d','e'),(1,2,3,4,5))) 输出为: dict_a = {'a': 1, 'c': 3, 'b': 2, 'e': 5, 'd': 4} 我想知道为什么不是: dict_a = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5} 我确实知道dict_a是一个非排序对象,但仍然想知道为什么键顺序是a、c、b、e、d,而不是其他顺序 谢谢字典不仅仅是分类的,它们是无序的

我有一本字典:

dict_a = dict(zip(('a','b','c','d','e'),(1,2,3,4,5)))
输出为:

dict_a = {'a': 1, 'c': 3, 'b': 2, 'e': 5, 'd': 4}
我想知道为什么不是:

dict_a = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
我确实知道dict_a是一个排序对象,但仍然想知道为什么键顺序是a、c、b、e、d,而不是其他顺序


谢谢

字典不仅仅是分类的,它们是无序的。在更深的层次上,字典是指向内存地址的键


让我们换一种方式来解决这个问题。在传统语言中,有数组。在内部,数组是连续内存,即
x[0]
x[1]
在内存中相邻。与此同时,字典是指针的松散集合
y[a]
y[b]
没有物理关系,它们没有顺序。

字典不仅仅是排序的,它们是无序的。在更深的层次上,字典是指向内存地址的键


让我们换一种方式来解决这个问题。在传统语言中,有数组。在内部,数组是连续内存,即
x[0]
x[1]
在内存中相邻。与此同时,字典是指针的松散集合
y[a]
y[b]
没有物理关系,它们没有顺序。

正如你所说,字典不是有序对象。因此,无论您以何种顺序向其中添加项目,它们都会混乱不堪。字典不支持索引,因此没有理由使用正确的顺序。我想这样可以节省内存,而不必知道项目应该位于什么位置

在某种程度上,您可以说它们使用键进行索引以获取关联的值,而不是列表中的位置。对于一个值,只能有一个不同的关键点,因为在列表中的位置0处只能有1个值


如你所说,字典不是有序对象。因此,无论您以何种顺序向其中添加项目,它们都会混乱不堪。字典不支持索引,因此没有理由使用正确的顺序。我想这样可以节省内存,而不必知道项目应该位于什么位置

在某种程度上,您可以说它们使用键进行索引以获取关联的值,而不是列表中的位置。对于一个值,只能有一个不同的关键点,因为在列表中的位置0处只能有1个值


有关详细信息,请参见前面的详细讨论:


(这本应该是一个评论,但我没有写评论的名声…

请参阅前面的详细讨论:


(这本应该是一个评论,但我没有写评论的名声…

,因为常规用语不包含插入顺序过程。它使用任意顺序。所以,如果您想按顺序使用字典,您应该使用它,它包含插入顺序过程。但是,当你使用有序字典时,你需要考虑你的用法,因为在插入项目并更新它时,它比普通字典慢。

,因为常规字典不包含插入顺序过程。它使用任意顺序。所以,如果您想按顺序使用字典,您应该使用它,它包含插入顺序过程。但是,当你使用有序字典时,你需要考虑你的用法,因为在插入项目并更新它时,它比普通字典慢。 < p>如果你想保持字典中的条目的顺序,可以使用<代码>有序DICT < /代码>:

from collections import OrderedDict
dict_a = ()
dict_a['a'] = 1
dict_a['b'] = 2
dict_a['c'] = 3
dict_a['d'] = 4
dict_a['e'] = 5
然后将保持字典的顺序:

dict_a = OrderedDict([('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5)])

如果要保持词典中项目的顺序,可以使用
OrderedDict

from collections import OrderedDict
dict_a = ()
dict_a['a'] = 1
dict_a['b'] = 2
dict_a['c'] = 3
dict_a['d'] = 4
dict_a['e'] = 5
然后将保持字典的顺序:

dict_a = OrderedDict([('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5)])

所以,首先我认为是zip引起的。然而,自从我进入后,它就没有拉链了

>>zip(('a','b','c','d','e'),(1,2,3,4,5)
输出从左到右

[('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5)]
所以我认为这可能与我们系统之间的内存存储有关(我使用的是windows10)。我用相同的输入进行了检查,得到了相同的输出

>>dict_a = dict(zip(('a','b','c','d','e'),(1,2,3,4,5)))

{'a': 1, 'c': 3, 'b': 2, 'e': 5, 'd': 4}
现在,我在查看文档。他们的代码更符合您的期望

>>c = dict(zip(['one', 'two', 'three'], [1, 2, 3]))
具有从右到左的输出(在压缩字典通过弹出值和使用update函数添加的两个列表后,我猜是这样)

无论您如何放入不同的字典,它仍然具有相同的输出(字典如集合作为OP状态顺序并不重要)

python手册说明了内置类型

如果给定了关键字参数,则关键字参数及其值将添加到从位置参数创建的字典中

考虑到即使更换或不更换拉链,钥匙也不会改变,我尝试了最后一件事。我决定换钥匙和物品

>>d = dict([(1,'a'), (2,'b'),(3,'c'),(4,'d'),(5,'e')])
输出了我们期望的结果

{1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e'}

按数字排序。我唯一的解释是,在实际编译过程中,字母“a”、“b”、“c”、“d”、“e”被存储为另一种形式(例如十六进制而非ascii),这将改变字典中用于键的列表中a、b、c、d、e的顺序。

因此,首先我认为是zip导致了它。然而,自从我进入后,它就没有拉链了

>>zip(('a','b','c','d','e'),(1,2,3,4,5)
输出从左到右

[('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5)]
所以我认为这可能与我们系统之间的内存存储有关(我使用的是windows10)。我用相同的输入进行了检查,得到了相同的输出

>>dict_a = dict(zip(('a','b','c','d','e'),(1,2,3,4,5)))

{'a': 1, 'c': 3, 'b': 2, 'e': 5, 'd': 4}
现在,我在查看文档。他们的代码更符合您的期望

>>c = dict(zip(['one', 'two', 'three'], [1, 2, 3]))
具有从右到左的输出(在压缩字典通过弹出值和使用update函数添加的两个列表后,我猜是这样)

无论您如何放入不同的字典,它仍然具有相同的输出(字典如集合作为OP状态顺序并不重要)

python手册说明了内置类型

如果给定了关键字参数,则关键字参数及其值将添加到从位置参数创建的字典中

鉴于此