yuan00yu 2019-06-28
与list相比:在list中查找元素的方法,list越大,查找越慢。但是dict的实现方式,根据key值计算出value的存放位置,然后再去取存放位置的值。一个key只能对应一个value值,提高了查找速度。
for key in dict_name: print(dict_name[key]) # 根据字典键key进行排序输出 for key in sorted(dict_name): # 是sorted(),不是sort() print(dict_name[key])
'pi' in d False
>>> d.get('xiong') # 也可以直接 d['xiong'] 90 >>> d.get('pi',0) # 自己指定。如果不存在该key,就返回0,存在返回原值。 0
inventory = { 'gold' : 500, 'pouch' : ['flint', 'twine', 'gemstone'], 'backpack' : ['xylophone','dagger', 'bedroll','bread loaf'] } # 新添加一个key-value inventory['burlap bag'] = ['apple', 'small ruby', 'three-toed sloth'] inventory['gold'] += 50 inventory['backpack'].sort() inventory['backpack'].remove('dagger')
>>> d = {'xiong':90,'li':95,'ping':100} >>> d.pop('xiong') 90 >>> d {'li': 95, 'ping': 100}
>>> del d['ping'] >>> d {'li': 95}
# 语法形式 >>> dict_name.clear()
>>> d_1 = {1:'x',2:'y',3:'z'} >>> d_1.keys() dict_keys([1, 2, 3]) >>> >>> d_1.values() dict_values(['x', 'y', 'z']) >>> >>> d_1.items() dict_items([(1, 'x'), (2, 'y'), (3, 'z')]) >>> >>> type(d_1.keys()),type(d_1.values()),type(d_1.items()) (<class 'dict_keys'>, <class 'dict_values'>, <class 'dict_items'>)
例如现在有dict1,要创建一个一样的dict2,我们可以通过赋值操作“=”来创建一个内容一样的dict2,但是修改dict2的值会该表dict1的值:
>>> dict1 = {'up':'down','right':'left','true':'false'} >>> dict2 = dict1 >>> dict2['up']='change' #对赋值而来dict2的修改会同时修改dict1(源) >>> dict1 {'up': 'change', 'right': 'left', 'true': 'false'}
这是为什么呢?可以看下图,通过赋值操作“=”创建的新的字典变量,其指向的id都是一样的,所以当修改新变量的内容引用时,源指向的id内容也发生了改变。
如果要想修改新创建的变量而不影响源变量,可以使用copy()。例如,如下copy的值不会修改dict1的值
>>> dict1 = {'up':'down','right':'left','true':'false'} >>> copy = dict1.copy() # 字典copy是对dict1的拷贝 >>> copy['up'] = 'change2' >>> dict1 # 对拷贝的copy字典修改不会修改源字典 {'up': 'change', 'right': 'left', 'true': 'false'}
而list相反:
所以,dict是用空间来换取时间的一种方法。dict可以用在需要高速查找的很多地方,在Python代码中几乎无处不在,正确使用dict非常重要,需要牢记的第一条就是dict的key必须是不可变对象。
❤ 在有些python中,dict并不一定会按照键-值的添加顺序来保存元素的顺序。
若要保证字典的顺序性,则可以使用Python标准库collections模块OrderDict的有序字典。
使用方式:
from collections import OrderDict OrderDict().keys()
❤ 在复制和遍历字典时,最坏情况的复杂度为O(n),n为字典曾经达到的最大元素数目,而不是当前字典的大小。So此时遍历这个字典可能需要花相当长的时间。如果要频繁地遍历这个字典,最好的方式是创建一个新的字典对象,而不是在旧的字典中对元素进行操作,删除元素。