我试图绕过update()并且我必须经历的例子是
dict = {'Name': 'Zara', 'Age': 7}
dict2 = {'Sex': 'female' }
dict.update(dict2)
print "Value : %s" % dict
然后输出
价值:{'年龄':7,'姓名':'Zara','性':'女'}}
我知道你正在使用dict并用dict2更新它,但为什么输出切换'Name':'Zara'带'Age'?名称部分不应该%s?我不明白这一部分。
答案 0 :(得分:1)
按照设计,Python中的字典不是有序的。它们经过优化,可以通过键访问,因此插入顺序并不重要,因为提取速度已经过优化。
有一个名为OrderedDict
的单独类型,它保留了输入密钥的顺序。
字典的这个“功能”取决于您正在使用的Python的实现。例如,在PyPy中,dictionaries are ordered by default(顺便提一下,从Python 3.6开始,this same implementation will be part of the "standard" Python(在C中实现),因为它有其他好处)。
通过阅读How are Python's Built In Dictionaries Implemented的答案,您可以在内部找到更多内容吗?
答案 1 :(得分:0)
没有任何东西被“转换”;词典基本上是无序的。
来自the Python Docs on Data Structures(强调我的):
最好将字典视为无序密钥组:值对,并要求密钥是唯一的(在一个字典中)。
这意味着dict
中的键值对可以按任何顺序打印出来。在这种情况下,它们碰巧按字母顺序排序,但这种行为永远不会得到保证,并且不能依赖。通过调用dict
,基础update
没有以任何方式“重新组织”,它只是从未有过那种配对组织。
答案 2 :(得分:-2)
根据我的理解,python词典不保持插入顺序。例如,
In [1]: dict = {'Name': 'Zara', 'Age': 7}
In [2]: dict
Out[2]: {'Age': 7, 'Name': 'Zara'}
In [3]: dict2 = {'Sex': 'female' }
In [4]: dict.update(dict2)
In [5]: print "Value : %s" % dict
Value : {'Age': 7, 'Name': 'Zara', 'Sex': 'female'}
In [6]: dict.update({'place': 'mangalore'})
In [7]: dict
Out[7]: {'Age': 7, 'Name': 'Zara', 'Sex': 'female', 'place': 'mangalore'}
In [8]: dict.update({'Place': 'mangalore'})
In [9]: dict
Out[9]:
{'Age': 7,
'Name': 'Zara',
'Place': 'mangalore',
'Sex': 'female',
'place': 'mangalore'}
In [10]: ord('p')
Out[10]: 112
In [11]: ord('A')
Out[11]: 65
In [12]: dict.update({1: 2})
In [13]: dict
Out[13]:
{1: 2,
'Age': 7,
'Name': 'Zara',
'Place': 'mangalore',
'Sex': 'female',
'place': 'mangalore'}
In [15]: ord('1')
Out[15]: 49
如果您看到ord('p')
和ord('A')
,则分别为112和65。这可能是place
位于底部而A位于其前面并且“1”位于顶部的原因。
A-Z的ascii为65-90,a-z的值为97-122。
另一个例子,
In [16]: d = {'ac':33, 'gw':20, 'ap':102, 'za':321, 'bs':10}
In [17]: d
Out[17]: {'ac': 33, 'ap': 102, 'bs': 10, 'gw': 20, 'za': 321}
如果你想跟踪插入顺序,那么你必须使用OrderedDict
In [22]: from collections import OrderedDict
In [27]: l = [('ac', 33), ('gw', 20), ('ap', 102), ('za', 321), ('bs', 10)]
In [28]: OrderedDict(l)
Out[28]: OrderedDict([('ac', 33), ('gw', 20), ('ap', 102), ('za', 321), ('bs', 10)])