Python 之字典常用方法

版权声明:支持原创,转载请说明~ https://blog.csdn.net/luoyayun361/article/details/82989733

前言

前面文章讲到了列表和字符串的常用方法,有些方法看似非常简单,但是真正到用的时候还是会出问题,今天来总结一些字典的常用方法。

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'])

猜你喜欢

转载自blog.csdn.net/luoyayun361/article/details/82989733