Python 第七天 dict字典详解

Python字典(dict)是一种无序的、可变的序列,元素以”键值对(key-value)“的形式存储。

字典是Python中唯一的映射类型。映射:元素之间相互对应的关系,即通过一个元素,可以唯一找到另一个元素;

 

 

 元素对应的索引称为键(key),各个键对应的元素称为值(value),键及其关联的值称为”键值对“。

字典类型的主要特征:

 

 

 字典也有自己的类型:

a = {'name':'张三', 'age':25}
print(type(a))

<class 'dict'>

创建字典:

(1)使用 { } 创建字典;

字典中每个元素都包含两部分,分别是键(key)和值value),键和值在创建时用冒号 : 分隔,相邻元素之间用逗号分隔,所有元素都放在大括号 { } 里。

语法格式:(同一个字典里的键必须唯一)

dict_name = {'key': 'value1', 'key2': 'value2',...,'keyn':'value'}

实例:

 1 # 使用字符串作为key
 2 scores = {"数学":85, "语文": 95, "英语": 88}
 3 print(scores)
 4 
 5 # 使用元组和数字作为key
 6 dict1 = {(20, 30): 'great', 30: [1, 2, 3]}
 7 print(dict1)
 8 
 9 # 创建空元组
10 dict2 = { }
11 print(dict2)

结果:

{'数学': 85, '语文': 95, '英语': 88}
{(20, 30): 'great', 30: [1, 2, 3]}
{}

字典的值可以是python支持的任意数据类型,只要符合唯一和不可变的特性就行;

(2)通过fromkeys() 方法创建字典:

语法格式:

dict_name = dict.fromkeys(list, value = None)

list 参数表示字典中所有键的列表(list);value 参数表示默认值,如果不写,则为空值 None。

示例:

1 knowledge = ['语文', '数学', '英语']
2 score = dict.fromkeys(knowledge, 60)
3 print(score)

结果:

{'语文': 60, '数学': 60, '英语': 60}

这样就相当于初始化字典,设置 value 的默认值。

(3)通过 dict() 映射函数创建函数:

 

 注意:若采用以上的方式创建字典,字典里的各元素的键只能是字符串、元组或者数字,不能是列表。列表是可变的,不能作为键。

如果不为 dict() 函数传入任何函数,则创建一个空的字典。

访问字典:

字典访问元素,是通过键来访问对应的值。因为字典中的元素是无序的,每个元素的位置都不固定。

具体格式:

dict_name[key]

注意:key是键名,必须得是存在的,否则会抛出异常

示例:

1 a = (['one', 36], ['two', 72], ['three', 150], ['four', -89])
2 dic = dict(a)
3 # 键存在
4 print(dic['one'])
5 # 键不存在
6 print(dic['five'])

结果:

36
Traceback (most recent call last):
  File "D:\pythonProject\one day\test.py", line 410, in <module>
    print(dic['five'])
KeyError: 'five'

此外,也可以使用 dict 类型提供的 get() 方法来获取指定键对应的值。当指定的键不存在时,get() 方法不会抛出异常。

语法格式:

dict_name.get(key[,default])

dict_name 表示字典变量的名字;key 表示指定的键;default 用于指定要查询的键不存在时,此方法返回的默认值,如果不手动指定,会返回 None。

示例:

1 a = dict(two=0.15, one=58, three=150, four=-36)
2 print(a.get('one'))

结果:

58

当键不存在时,get() 返回空值None,也可手动设置返回的值;

示例:

1 a = dict(two=0.15, one=58, three=150, four=-36)
2 # 键不存在,返回空值None
3 print(a.get('five'))
4 # 键不存在,返回指定内容
5 print(a.get('six', '该键不存在'))

结果:

None
该键不存在

删除字典:

手动删除也可以使用 del 关键字。

示例:

1 a = dict(two=0.15, one=58, three=150, four=-36)
2 print(a)
3 del a
4 print(a)

结果:

{'two': 0.15, 'one': 58, 'three': 150, 'four': -36}
Traceback (most recent call last):
  File "D:\pythonProject\one day\test.py", line 417, in <module>
    print(a)
NameError: name 'a' is not defined

 

 字典的基本操作(添加、修改、删除键值对)

添加键值对:

具体语法格式:

dict_name[key] = value

示例:

1 a = {'数学': 90}
2 print(a)
3 # 添加新键值对
4 a['语文'] = 95
5 print(a)
6 a['英语'] = 88
7 print(a)

结果:

{'数学': 90}
{'数学': 90, '语文': 95}
{'数学': 90, '语文': 95, '英语': 88}

修改键值对:

key不能修改,只能修改value;

示例:

1 a = {'数学': 90, '语文': 95, '英语': 88}
2 print(a)
3 a['语文'] = 100
4 print(a)

结果:

{'数学': 90, '语文': 95, '英语': 88}
{'数学': 90, '语文': 100, '英语': 88}

删除键值对:

使用 del 关键字。

示例:

1 a = {'数学': 90, '语文': 95, '英语': 88}
2 del a['数学']
3 del a['语文']
4 print(a)

结果:

{'英语': 88}

判断字典中是否存在指定键值对:

判断字典是否包含指定键值对的键,使用 in 或 not in 运算符,基于 key 来判断。

示例:

1 a = {'数学': 90, '语文': 95, '英语': 88}
2 # 判断 a 中是否包含名为 ‘数学’ 的key
3 print('数学' in a)
4 # 判断 a 是否包含名为 '化学' 的key
5 print('化学' in a)

结果:

True
False

 

keys()、values()和items()方法:

keys() 方法用于返回字典中的所有键(key);

values() 方法用于返回字典中所有键对应的值(value);

items() 用于返回字典中所有的键值对(key-value)。

示例:

1 a = {'数学': 90, '语文': 95, '英语': 88}
2 print(a.keys())
3 print(a.values())
4 print(a.items())

结果:

dict_keys(['数学', '语文', '英语'])
dict_values([90, 95, 88])
dict_items([('数学', 90), ('语文', 95), ('英语', 88)])

如果想使用这三个方法返回的数据,可以采取以下两种方法:

(1)使用 list() 函数,将返回的数据转换成列表:

1 a = {'数学': 90, '语文': 95, '英语': 88}
2 b = list(a.keys())
3 print(b)

结果:

['数学', '语文', '英语']

(2)使用 for in 循环遍历它们的返回值:

1 a = {'数学': 90, '语文': 95, '英语': 88}
2 for b in a.keys():
3     print(b, end=' ')
4 print("\n-----------")
5 for c in a.values():
6     print(c, end=' ')
7 print('\n+++++++++++')
8 for b,c in a.items():
9     print("key:", b, " values:", c)

结果:

数学 语文 英语 
-----------
90 95 88 
+++++++++++
key: 数学  values: 90
key: 语文  values: 95
key: 英语  values: 88

 

copy() 方法:

返回一个字典的拷贝,也返回一个具有相同键值对的新字典。

示例:

1 a = {'one': 1, 'two': 2, 'three': [1, 2, 3]}
2 b = a.copy()
3 print(b)

结果:

{'one': 1, 'two': 2, 'three': [1, 2, 3]}

注意:copy()方法遵循的拷贝原理,既有深拷贝也有浅拷贝。copy()方法只会对最表层的键值对进行浅拷贝,会申请一块内存来存放{'one': 1, 'two': 2, 'three': []};对于某些列表类型的值来说,此方法对其做的是浅拷贝,也就是说。b中的[1, 2, 3]的值不是自己独有,而是和 a 共有。

 1 a = {'one': 1, 'two': 2, 'three': [1, 2, 3]}
 2 b = a.copy()
 3 # 向 a 中添加新键值对,由于b已经提前将 a 所有的键值对都深拷贝过来,因此 a 添加键值对不会影响 b。
 4 a['four'] = 100
 5 print(a)
 6 print(b)
 7 # 由于 b 和 a 共享[1, 2, 3](浅拷贝),因此移除 a 中列表中的元素,也会影响 b.
 8 a ['three'].remove(1)
 9 print(a)
10 print(b)

结果:

{'one': 1, 'two': 2, 'three': [1, 2, 3], 'four': 100}
{'one': 1, 'two': 2, 'three': [1, 2, 3]}
{'one': 1, 'two': 2, 'three': [2, 3], 'four': 100}
{'one': 1, 'two': 2, 'three': [2, 3]}

 

update() 方法:

使用一个字典所包含的键值对来更新已有的字典。如何被更新的字典中已包含对应的键值对,那么原value会被覆盖;如果被更新的字典中不包含对应的键值对,则该键值对被添加进去。

示例:

1 a = {'one': 1, 'two': 2, 'three': 3}
2 a.update({'one': 4.5, 'four': 9.3})
3 print(a)

结果:

{'one': 4.5, 'two': 2, 'three': 3, 'four': 9.3}

 

pop() 和popitem() 方法:

pop() 用来删除指定的键值对,popitem() 用来随机删除一个键值对。

语法格式:

dict_name.pop(key)
dict_name.popitem()

示例:

1 a = {"数学": 98, "语文": 88, "英语": 95, "化学": 84, "生物": 96, "物理": 97}
2 print(a)
3 a.pop("化学")
4 print(a)
5 a.popitem()
6 print(a)

结果:

{'数学': 98, '语文': 88, '英语': 95, '化学': 84, '生物': 96, '物理': 97}
{'数学': 98, '语文': 88, '英语': 95, '生物': 96, '物理': 97}
{'数学': 98, '语文': 88, '英语': 95, '生物': 96}

setdefault() 方法:

用来返回某个key对应的value。

语法格式:

dict_name.setdefault(key, defaultvalue)

dict_name 表示字典名称,key 表示键,defaultvalue 表示默认值(可以不写,不写的话是 None).

当指定的 key 不存在时,setdefault() 会先为这个不存在的 key 设置一个默认的 defaultvalue,然后再返回 defaultvalue。
也就是说,setdefault() 方法总能返回指定 key 对应的 value:

如果该 key 存在,那么直接返回该 key 对应的 value;

如果该 key 不存在,那么先为该 key 设置默认的 defaultvalue,然后再返回该 key 对应的 defaultvalue。

示例:

 1 a = {"数学": 98, "语文": 88, "英语": 95}
 2 print(a)
 3 # key不存在,指定默认值
 4 a.setdefault('物理', 95)
 5 print(a)
 6 # key不存在,不指定默认值
 7 a.setdefault('化学')
 8 print(a)
 9 # key存在,指定默认值
10 a.setdefault('数学', 100)
11 print(a)

结果:

{'数学': 98, '语文': 88, '英语': 95}
{'数学': 98, '语文': 88, '英语': 95, '物理': 95}
{'数学': 98, '语文': 88, '英语': 95, '物理': 95, '化学': None}
{'数学': 98, '语文': 88, '英语': 95, '物理': 95, '化学': None}

 

posted @ 2022-07-19 17:39  南城古  阅读(149)  评论(0编辑  收藏  举报