本篇我们来聊一下Python中dict的常用方法,这个还是挺重要的,所以可以多花点时间学习一下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
a = {
'xiaoming': {'sex': 'male'},
'xiaobai': {'sex': 'female'}
}

# clear()清空字典
# a.clear()
# print(a)


# copy() 浅拷贝
# new_copy_a = a.copy()
# new_copy_a['xiaoming']['sex']= 'female'
# print(new_copy_a)
# print(a)

# copy,浅拷贝,只拷贝了最外层的对象的引用,如果浅拷贝的
# 时候有可变对象的应用,则如果修改了原来的值,则可变对象的值也就跟着改变.
# 比如上面的a字典,key的拷贝不会出现问题.但是value的值本身也是一个引用类型,
# 它是可变的,拷贝的时候只是拷贝了这个内部字典的应用.所以如果它修改了,则原来的那个
# 对象也会跟着修改.

# 运行结果:
# {'xiaoming': {'sex': 'female'}, 'xiaobai': {'sex': 'female'}}
# {'xiaoming': {'sex': 'female'}, 'xiaobai': {'sex': 'female'}}


import copy
new_deepcopy_a =copy.deepcopy(a)
new_deepcopy_a['xiaoming']['sex']= 'female'
print(a)
print(new_deepcopy_a)

# 运行结果:
# {'xiaoming': {'sex': 'male'}, 'xiaobai': {'sex': 'female'}}
# {'xiaoming': {'sex': 'female'}, 'xiaobai': {'sex': 'female'}}

创建字典的方式:1、d = {key1:value1,key2:value2} ;2、dict([(key1,value1),(key2,value2)]) ;3、关键词参数:dict(key1=value1,key2=value2)


字典也是可以使用del关键词来删除元素和整个字典的;字典也有许多内建的方法,但是不可以像列表、元组那样频繁使用;


dict.clear()方法用于删除字典中内的所有项(项就是键值对),输出打印dict.clear(obj)显示None,注意这一点和直接把空字典赋值的区别。


深复制:from copy import deepcopy;deepcopy()方法,也就是说原样本通过深复制出来的复制品无论怎样修改,对于原样本没有任何关系。

浅复制:dict.copy(),原样本通过浅复制出来的复制品,如果是对于不可变对象的修改,那么原样本不会发生变化;对于可变对象的修改,原样本也会随之发生变化。


dict.fromkeys(seq[,value])方法,该方法用于创建一个新的字典,以序列seq中的元素做字典的键,value为字典所有键对应的初始值,如果value参数不传值,则默认为None。该方法返回结果是一个字典。fromkeys()方法使用给定的键值建立新的字典,每个键默认对应的值为None。


dict.get(key,default=None)方法,用于返回指定键的值,如果值不在字典中就返回默认值None。使用其他方法试图访问字典中不存在的键值对时会出错,而使用get方法就不会,而是返回一个None对象。


dict.items()方法,以列表返回可遍历的(键,值)元组数组,该方法不需要参数。直接输出打印dict.items()的结果是:dict_items([(“key1”,”value1”), (“key2”,”value2”)])。


dict.keys()方法,以列表返回一个字典所有的键,该方法不需要参数。直接输出打印dict.keys()的结果是:dict_keys([“key1”, “key2”])。


dict.values()方法,以列表返回一个字典所有的值,该方法不需要参数。直接输出打印dict. values ()的结果是:dict_values([“value1”, “value2”])。(注意返回的列表里面可以有重复值)


dict.setdefault()方法,该方法和get()方法类似,用于获得与给定相关联的值。如果键不存在于字典中,就会更新字典,添加键并将值设为默认值。Dict.setdefault(key, default=None)其中key代表查找的键值,default代表键不存在时设置的默认键值,该方法没有任何返回值。


字典不属于序列,因此字典的合并必须使用dict.update(dict2)方法,用于将字典dict2的键值对更新到dict里面。直接输出打印dict. update(dict2)的结果是:None。注意如果后面待添加的字典里面和前面具有相同的键,则后面的键会将前面的键进行覆盖。


update可以将一个字典,一个赋值表达式,或者一个元组(嵌套元组),列表(嵌套元组)合并到字典中,具体操作如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
b = {'name': 'envy'}
b.update({'age': 19})
print(b)

b.update(sex ="male", score = 100)
print(b)

b.update([('money', 69)])
print(b)

b.update((('school', 'nanjing'),))
print(b)

# 运行结果:
{'name': 'envy', 'age': 19}
{'name': 'envy', 'age': 19, 'sex': 'male', 'score': 100}
{'name': 'envy', 'age': 19, 'sex': 'male', 'score': 100, 'money': 69}
{'name': 'envy', 'age': 19, 'sex': 'male', 'score': 100, 'money': 69, 'school': 'nanjing'}

上面为什么是需要嵌套元组,可以查看dict的源码了解一下:

1
2
3
4
5
6
7
8
def update(self, E=None, **F): # known special case of dict.update
"""
D.update([E, ]**F) -> None. Update D from dict/iterable E and F.
If E is present and has a .keys() method, then does: for k in E: D[k] = E[k]
If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v
In either case, this is followed by: for k in F: D[k] = F[k]
"""
pass

列表是没有key的,因此无法满足要求。