Python数据结构:字典(dict)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


字典

字典为非常重要的python数据结构,无论是后端开发,爬虫,数据分析,人工智能都是用到了字典的方法和原理。

字典的定义

与字符串、列表、元组都不同,字典是一个可变的无序映射集合,包含一系列的"key : value"对。
字典是可变的,因此可以对键值对进行添加、删除、修改。
字典是无序的映射集合,因此字典不能进行索引和切片。

字典的创建

使用符号创建

使用大括号{}创建字典,示例如下:

>>> d1 = {
    
    'name':'lilei', 'age':20, 'grade':'three'} # 字符串作为键
>>> print(d1)
{
    
    'name': 'lilei', 'age': 20, 'grade': 'three'}

>>> d2 = {
    
    } # 使用{}创建空字典
>>> print(d2)
{
    
    }

>>> d3 = {
    
    (1,2,3):'a', (10001,): 1002} # 使用元组作为键
>>> print(d3)
{
    
    (1, 2, 3): 'a', (10001,): 1002}

>>> d4 = {
    
    100.1:100, 1002:200} # 使用数值型作为键,不能使用0开头的数值作为键,会报错
>>> print(d4)
{
    
    100.1:100, 1002:200}

>>> d5 = {
    
    [1,2,3]:'a', [4,5,6]:[7,8,9]} # 使用列表作为键会报错
>>> print(d5)
Traceback (most recent call last):
  File "\test.py", line 1, in <module>
    d5 = {
    
    [1,2,3]:'a', [4,5,6]:[7,8,9]}
TypeError: unhashable type: 'list'

注意:

  • 字典的键可以采用字符串、数值型、元组等不可变类型,列表为可变类型不能用作字典的键;
  • 字典的值可以是任意类型;
  • 数值型作为字典的键时不能以0开始;
  • 字典的键不能重复,如果重复,只保留后面的键值对;
  • 字典存储的是对象的引用,而不是对象本身。

使用函数创建

使用dict()函数可以将其他类型转换为字典,示例如下:

>>> s1 = [('name', 'lilei'), ('age', 20), ('grade', 'three')] # 使用包含键元组和值元组的列表创建字典
>>> d1 = dict(s1)
>>> print(d1)
{
    
    'name': 'lilei', 'age': 20, 'grade': 'three'}

>>> d2 = dict(name='lilei', age=20, grade='three') # 使用赋值格式的键值对创建字典
>>> print(d2)
{
    
    'name': 'lilei', 'age': 20, 'grade': 'three'}

字典元素获取

字典是一个无序映射集合,字典没有索引和切片的功能。字典通过键获取对应的值,语法如下:

dict[key]

字典使用键获取值的语法和序列的索引类似,都使用[]。

示例如下:

>>> d1 = {
    
    'name': 'lilei', 'age': 20, 'grade': 'three'}
>>> print(d1['name'])
lilei
>>> print(d1['age'])
20

字典元素添加

1.使用赋值号"="为字典添加键值对

语法如下:

dict[key] = value

示例如下:

>>> d1 = {
    
    'name': 'lilei', 'age': 20, 'grade': 'three'}
>>> d1['sex'] = 'male' # 'sex'键不存在,为字典添加该键值对
>>> print(d1)
{
    
    'name': 'lilei', 'age': 20, 'grade': 'three', 'sex': 'male'}

为字典添加键值对时,字典会判断该键在字典中是否存在,如果不存在则为字典添加键值对,如果存在则修改该键的值为新的值,原因是字典的键不能重复。

2.使用update()方法添加键值对

语法如下:

dict.update(dict2)

参数:

  • dict2 – 添加到指定字典dict里的字典。

返回值:无返回值。

示例如下:

>>> d1 = {
    
    'name': 'lilei', 'age': 20, 'grade': 'three'}
>>> d2 = {
    
    'math':95, 'chinese':92, 'english': 90}
>>> d1.update(d2)
>>> print(d1)
{
    
    'name': 'lilei', 'age': 20, 'grade': 'three', 'math': 95, 'chinese': 92, 'english': 90}

字典元素删除

1.del语句删除

使用del语句删除字典中的键值对,无返回值,语法如下:

del dict[key]

示例如下:

>>> d1 = {
    
    'name': 'lilei', 'age': 20, 'grade': 'three'}
>>> del d1['name']
>>> print(d1)
{
    
    'age': 20, 'grade': 'three'}

2.pop方法删除

从字典中删除键,并返回映射值,语法如下:

dict.pop(key[,default])

参数:

  • key: 要删除的键值
  • default: 如果没有 key,返回 default 值,如果没有指定default则会报错。

示例如下:

>>> d1 = {
    
    'name': 'lilei', 'age': 20, 'grade': 'three'}
>>> print(d1.pop('age')) # 返回'age'键对应的值
20
>>> print(d1)
{
    
    'name': 'lilei', 'grade': 'three'}

>>> print(d1.pop('class', None)) # 字典中没有'class'键,返回设置的默认是None
None

3.popitem方法删除

popitem() 方法随机返回并删除字典中的最后一对键和值。如果字典已经为空,却调用了此方法,就报出KeyError异常,语法如下:

dict.popitem()

示例如下:

>>> d1 = {
    
    'name': 'lilei', 'age': 20, 'grade': 'three'}
>>> print(d1.popitem())
('grade', 'three')

注意:字典是无序的,Python3.5和之前的版本字典的键是无序的(每次输出的顺序都不一致),Python3.5以后的版本,字典的键值对输出固定了顺序。

字典元素修改

字典修改元素的语法同添加元素的语法:

dict[key] = value

为字典添加或者修改元素时,字典会判断该键是否存在,如果存在则修改该键的值,如果不存在则添加键值对,示例如下:

>>> d1 = {
    
    'name': 'lilei', 'age': 20, 'grade': 'three'}
>>> d1['age'] = 21 # 'age'键存在,修改该键的值为21
>>> print(d1)
{
    
    'name': 'lilei', 'age': 21, 'grade': 'three', 'sex': 'male'}

字典键值的循环遍历

字典属于可迭代对象,能够使用for循环对字典中的键值对进行循环遍历,但是需要借助字典的三个方法keys()、values()和items(),这三个方法用于返回字典键值对的视图对象,视图对象支持迭代操作,示例如下:

使用keys()方法循环字典的键

>>> d1 = {
    
    'name': 'lilei', 'age': 20, 'grade': 'three'}
>>> print(d1.keys())
dict_keys(['name', 'age', 'grade']) # 视图对象不是列表,不支持索引

# 使用for循环遍历字典的键
>>> for key in d1.keys():
... 	print(key)
name
age
grade

使用values()方法循环字典的值

>>> d1 = {
    
    'name': 'lilei', 'age': 20, 'grade': 'three'}
>>> print(d1.values())
dict_values(['lilei', 20, 'three'])

# 使用for循环遍历字典的值
>>> for value in d1.values():
... 	print(value)
lilei
20
three

使用items()方法循环字典的键值对

>>> d1 = {
    
    'name': 'lilei', 'age': 20, 'grade': 'three'}
>>> print(d1.items())
dict_items([('name', 'lilei'), ('age', 20), ('grade', 'three')])

# 使用for循环遍历字典的键值对
>>> for item in d1.items():
... 	print(item) # item是元组
('name', 'lilei')
('age', 20)
('grade', 'three')

# 使用key, value两个变量接收items()返回值
>>> for key, value in d1.items():
... 	print(key, value) 
name lilei
age 20
grade three

字典的函数

字典中提供了一些方法,下面介绍一些常用方法:

1.清空字典

clear()方法可以删除字典内所有的元素,语法如下:

dict.clear()

无参数,无返回值。示例如下:

>>> d1 = {
    
    'name': 'lilei', 'age': 20, 'grade': 'three'}
>>> d1.clear() # 清空字典的所有元素
>>> print(d1) 
{
    
    }

2.复制字典

copy()方法可以对字典进行浅复制,语法如下:

dict.copy()

无参数,返回一个字典的浅复制。示例如下:

>>> d1 = {
    
    'name': 'lilei', 'age': 20, 'grade': 'three'}
>>> d2 = d1.copy()
>>> print(d2)
{
    
    'name': 'lilei', 'age': 20, 'grade': 'three'}

# 使用id()函数测试两个字典的内存地址
>>> print(id(d1))
1886511206528
>>> print(id(d2)) # 两个字典的内存地址完全不同,d2引用了新的字典对象
1886511206720

注意:浅复制只能复制一层,如果字典中有多个层次,其他层次仍然引用同一个对象。

3.获取指定键的值

get()方法可以返回指定键的值,语法如下:

dict.get(key, default=None)

参数:

  • key – 字典中要查找的键。
  • default – 如果指定的键不存在时,返回该默认值。如果未指定默认值则返回None。

示例如下:

>>> d1 = {
    
    'name': 'lilei', 'age': 20, 'grade': 'three'}
>>> print(d1.get('name')) 
lilei

>>> print(d1.get('class', 'nothing'))
nothing

注意:get()方法的效果与字典通过键获取值dict[key]相同,区别在于使用get()方法如果键未找到不会报错,使用dict[key]如果字典中没有该键将会报错:KeyError。

以上是字典必须掌握的方法,熟悉掌握字典的各种方法和操作非常重要。

猜你喜欢

转载自blog.csdn.net/shield911/article/details/124110525