试图绕过update()

时间:2017-04-13 06:10:59

标签: python dictionary

我试图绕过update()并且我必须经历的例子是

dict = {'Name': 'Zara', 'Age': 7}
dict2 = {'Sex': 'female' }

dict.update(dict2)
print "Value : %s" %  dict

然后输出

价值:{'年龄':7,'姓名':'Zara','性':'女'}}

我知道你正在使用dict并用dict2更新它,但为什么输出切换'Name':'Zara'带'Age'?名称部分不应该%s?我不明白这一部分。

3 个答案:

答案 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)])