为什么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手册说明了内置类型
如果给定了关键字参数,则关键字参数及其值将添加到从位置参数创建的字典中
鉴于此