前言
前面文章讲到了列表和字符串的常用方法,有些方法看似非常简单,但是真正到用的时候还是会出问题,今天来总结一些字典的常用方法。
1.clear
方法 clear 删除所有的字典项,这种方法是就地执行,没有返回值。
示例如下:
>>> a = {'name':'jack','age':12}
>>> a.clear()
>>> a
{}
这个方法有什么用呢,接着来看两个场景:
>>> a = {}
>>> b = a
>>> a['name'] = 'jack'
>>> a
{'name': 'jack'}
>>> b
{'name': 'jack'}
>>> a = {}
>>> b
{'name': 'jack'}
另一个场景:
>>> a = {}
>>> b = a
>>> a['name'] = 'jack'
>>> b
{'name': 'jack'}
>>> a.clear()
>>> b
{}
这两个场景中,a 和 b 都指向同一个字典,在第一个场景中,通过将一个空字典赋值给 a 来清空,这对 b 没有任何影响,它依然指向原来的字典,但要删除原来字典中的所有元素,必须用 clear 方法。
2. copy
方法 copy 返回一个新字典。其键值对和原来的字典相同,这个方法执行的是浅复制,因为值本身是原件,而非副本。
来看看示例:
>>> a = {'name':'jack','age':12}
>>> b = a.copy()
>>> b['name'] = 'mark'
>>> a
{'name': 'jack', 'age': 12}
>>> b
{'name': 'mark', 'age': 12}
上面试执行替换操作。
>>> a = {'name':'jack','age':12}
>>> b = a.copy()
>>> b['addr'] = 'china'
>>> a
{'name': 'jack', 'age': 12}
>>> b
{'name': 'mark', 'age': 12, 'addr': 'china'}
上面是执行新增操作。
>>> a = {'name':['jack'],'age':12}
>>> b = a.copy()
>>> b['name'].append('xxx')
>>> a
{'name': ['jack', 'xxx'], 'age': 12}
>>> b
{'name': ['jack', 'xxx'], 'age': 12}
这里是执行新增操作。
通过上三个示例可以看出,当替换和新增副本中的值时,原件不受影响,然后,如果修改副本中的值(就地修改而不是替换),原件也将会发生变化,因为原件指向的也是被修改的值。
为避免这种问题,一种办法是执行深复制,即同时复制值及其包含的所有值。可使用模块 copy 中的函数 deepcopy
>>> from copy import deepcopy
>>> a = {'name':['jack'],'age':12}
>>> b = deepcopy(a)
>>> c = a.copy()
>>> a['name'].append('mark')
>>> a
{'name': ['jack', 'mark'], 'age': 12}
>>> b
{'name': ['jack'], 'age': 12}
>>> c
{'name': ['jack', 'mark'], 'age': 12}
3.fromkeys
方法 fromkeys 创建一个新字典,其中包含指定的键,且每个键对应的值都是 None
示例:
>>> dict.fromkeys(['name','age'])
{'name': None, 'age': None}
>>> dict.fromkeys(['name','age'],'(Unknow)')
{'name': '(Unknow)', 'age': '(Unknow)'}
如果不想使用默认值 None,可提供特定的值,如上面的’(Unknow)’
4.get
get 为访问字典提供了宽松的环境,通常,如果访问字典中没有的项将会引发错误,这时候就可以用 get 方法了,get 在访问不存在的键时,没有引发异常,而是返回None,还可以指定默认值。
>>> a = {}
>>> a["name"]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'name'
使用 get 就可以避免这些问题。
>>> a = {}
>>> a.get("name")
>>> print(a.get("name"))
None
>>> print(a.get("name",'jack'))
jack
如果字典中包含健值,get 的作用与普通字段查找相同。
所以建议在访问字典的时候,尽可能的用 get 方法,减少不必要的错误。
5.items
items 返回一个包含所有字典项的列表,其中每个元素都是(key,value)的形式,字典项在列表中的排列顺序不确定。
>>> a = {'name':'jack','age':12,'addr':'china'}
>>> a.items()
dict_items([('name', 'jack'), ('age', 12), ('addr', 'china')])
返回值属于一种名为字典视图的特殊类型,字典视图可以用于迭代,另外还可以确定其长度以及对其执行成员资格检查,如下:
>>> a = {'name':'jack','age':12,'addr':'china'}
>>> it = a.items()
>>> len(it)
3
>>> ('name','jack') in it
True
视图的一个优点是不复制,它始终是底层字典的反映,即便是修改了底层字典亦是如此。
上面这段话可能不太好理解,来看个示例:
>>> a
{'name': 'mark', 'age': 12, 'addr': 'china'}
>>> it = a.items()
>>> it
dict_items([('name', 'mark'), ('age', 12), ('addr', 'china')])
>>> a['name'] = 'jack'
>>> it
dict_items([('name', 'jack'), ('age', 12), ('addr', 'china')])
上面示例中,当字典 a 中的值已经修改过后,这时候无需再次给 it赋值,直接输出就是最新的结果。这是字典视图的一个优点,它不是简单的复制,而是始终是底层字典的反映。
如果要将字典视图复制到列表中,可以这样:
>>> lst = list(a.items())
>>> lst
[('name', 'jack'), ('age', 12), ('addr', 'china')]
6.keys
方法 keys 返回一个字典视图,其中包含字典的所有键。
>>> a = {'name': 'jack', 'age': 12, 'addr': 'china'}
>>> a.keys()
dict_keys(['name', 'age', 'addr'])
7.pop
方法 pop 可用于获取与指定键相关联的值,并将该键值从字典中删除。
>>> a = {'name': 'jack', 'age': 12, 'addr': 'china'}
>>> a.pop('age')
12
>>> a
{'name': 'jack', 'addr': 'china'}
8.popitem
方法 popitem 类似于 list.pop,但是 list.pop弹出来的是最后一个值,而字典的 popitem 弹出来的是随机字典项,因为字典的顺序是不确定的。
>>> a
{'name': 'jack', 'addr': 'china'}
>>> a.popitem()
('addr', 'china')
>>> a
{'name': 'jack'}
9.setdefault
方法 setdefault 有点像 get,因为它获取与指定键相关联的值,但除此之外,setdefault 还在字典不包含指定的键时,在字典中添加指定的键值对。
>>> a = {}
>>> a.setdefault('name','jack')
'jack'
>>> a
{'name': 'jack'}
这和 get 不太一样,如果字典不包含指定的键,就会自动在字典中添加指定的键值对。
如果字典中已经存在了键值对,那么保持字典不变。
>>> a = {}
>>> a['name'] = 'mark'
>>> a.setdefault('name','jack')
'mark'
>>> a
{'name': 'mark'}
10.update
update 使用一个字典中的项来更新另一个字典。
>>> a = {'name':'jack','age':12}
>>> b = {'name':'mark'}
>>> c = {'addr':'china'}
>>> a.update(b)
>>> a
{'name': 'mark', 'age': 12}
>>> a.update(c)
>>> a
{'name': 'mark', 'age': 12, 'addr': 'china'}
11.values
方法 values返回一个有字典中的值组成的字典视图,不同于方法 keys,values 返回的视图可能包含重复的值。
>>> a
{'name': 'mark', 'age': 12, 'addr': 'china'}
>>> a.values()
dict_values(['mark', 12, 'china'])