Python数据结构 — 字典(dict)

319 阅读4分钟

1. 什么是字典

1.1 字典定义

字典也是 Python 提供的一种常用的数据结构,它用于存放具有映射关系的数据。

比如有份成绩表数据,语文:79,数学:80,英语:92,这组数据看上去像两个列表,但这两个列表的元素之间有一定的关联关系。如果单纯使用两个列表来保存这组数据,则无法记录两组数据之间的关联关系。

为了保存具有映射关系的数据,Python 提供了字典,字典相当于保存了两组数据,其中一组数据是关键数据,被称为 key;另一组数据可通过 key 来访问,被称为 value。形象地看,字典中** key 和 value 的关联**如下:

image.png

1.2 字典特点

  • dict(字典) 是 除列表以外 Python 之中 最灵活 的数据类型

  • 字典同样可以用来 存储多个数据

    • 通常用于存储 描述一个 物体 的相关信息
  • 和列表的区别

    • 列表 是 有序 的对象集合
    • 字典 是 无序 的对象集合
  • 字典使用 键值对 存储数据,键值对之间使用 , 分隔

    •  key 是索引
    •  value 是数据
    •  和  之间使用 : 分隔
    • 键必须是唯一的
    •  可以取任何数据类型,但  只能使用 字符串数字或 元组

2. 字典常用方法

9db5007a-8ca8-4d1f-9a12-b995ad6ab8a4.jpg

2.1 创建字典

程序既可使用花括号语法来创建字典,也可使用 dict() 函数来创建字典。

d = {key1 : value1, key2 : value2}

d = dict()

dict1 = {} # 空字典定义
dict2 = {"name": "Tom", 'age': 18, 'height': 180}
dict3 = dict() # 空字典定义

print(type(dict1)) # <class 'dict'>
print(type(dict2)) # <class 'dict'>
print(type(dict3)) # <class 'dict'>
名称唯一性可存储数据类型可变性
key(键)唯一数字、字符串、元组不可变
value(值)不唯一任意可变

2.2 访问数据

  • 把相应的key放入熟悉的方括弧[](key不存在则报错)
  • dict2.get(key')(key不存在不会报错,返回None)
    • dict2.get(key, returnValue), 当key不存在时返回指定值(returnValue)
dict2 = {"name": "Tom", 'age': 18, 'height': 180}

print(dict2['name'])  # Tom
print(dict2['age'])  # 18
dict2 = {"name": "Tom", 'age': 18, 'height': 180}

print(dict2.get('name'))  # Tome
print(dict2.get('aaaa'))  # None

错误访问:如果用字典里没有的键访问数据,会输出错误KeyError

dict2 = {"name": "Tom", 'age': 18, 'height': 180}

print(dict2['good'])

image.png

为避免错误,可以用in判断key是否在字典中

dict2 = {"name": "Tom", 'age': 18, 'height': 180}

if 'good' in dict2:
    print(dict2['good'])
else:
    print('key "good" 不在字典中')

2.3 更新数据

  • 把相应的key放入方括弧[],对value重新赋值
    • 如果 key 存在则更新,不存在则新增
  • dict2.setdefault(key, newValue)
    • 字典中已存在相对应的key时不会更新其键的值,只能用于增加键值对
  • dict1.update(dict2) 把字典 dict2 的键/值对更新到 dict1 里
    • 有相同的键时:会使用最新的字典 dict2 中 该 key 对应的 value 值。
    • 有新的键时:会直接把字典 dict2 中的 key、value 加入到 dict1 中。
dict2 = {"name": "Tom", 'age': 18, 'height': 180}
dict2['name'] = '熊大'  # 更新数据

print(dict2['name']) # 熊大

2.4 删除数据

2.4.1 删除单个元素

del dict2[key]、dict2.pop(key) 都是指定键key,删除字典内的键值对。

  • del 没有返回值,pop() 返回当前删除键的
  • key不在字典中时二者均报错

dict2.popitem() 则是随机删除字典内一个键值对,并返回删除的键值对(元组形式)。

dict2 = {"name": "Tom", 'age': 18, 'height': 180}

del dict2['age']  # 删除指定key
print(dict2)  # {'name': 'Tom', 'height': 180}
dict2 = {"name": "Tom", 'age': 18, 'height': 180}

res = dict2.pop('age') # 删除指定key
print(res)  # 18
print(dict2)  # {'name': 'Tom', 'height': 180}
dict2 = {"name": "Tom", 'age': 18, 'height': 180}

res = dict2.popitem() # 随机删除键值对
print(res)  # ('height', 180)
print(dict2)  # {'name': 'Tom', 'age': 18}

2.4.2 清空字典数据

dict2.clear()

dict2 = {"name": "Tom", 'age': 18, 'height': 180}

dict2.clear()
print(dict2)  # {}

2.4.3 删除字典

del dict2

dict2 = {"name": "Tom", 'age': 18, 'height': 180}

del dict2

2.5 增加数据

把新增的key放入方括弧[],语法和更新数据相同,因此字典中有这个key为更新,没有这个key则新增。

dict2 = {"name": "熊大", 'age': 18, 'height': 180}
dict2['gender'] = "boy"  # 增加数据

print(dict2) # {'name': '熊大', 'age': 18, 'height': 180, 'gender': 'boy'}

2.6 其他函数和遍历

dict2.keys(), 返回所有key序列 dict2.values(), 返回所有value序列 dict2.items(),返回所有(key, value)元组序列

dict2 = {"name": "Tom", 'age': 18, 'height': 180}

print(dict2.keys())  # dict_keys(['name', 'age', 'height'])
print(dict2.values())  # dict_values(['Tom', 18, 180])
print(dict2.items())  # dict_items([('name', 'Tom'), ('age', 18), ('height', 180)])

注:dict_keys、dict_values、dict_items不是列表,是键的迭代形式,可通过list()将其转化为list

字典循环遍历

for ... in ... 默认取字典中的 keys() 所有的键 ,然后再通过键获取值。

然而我们可以通过字典中的 items() 来一次遍历键和值

dict2 = {"name": "Tom", 'age': 18, 'height': 180}

for a in dict2:
    print(a + ": " + str(dict2[a]))
    
'''
name: Tom
age: 18
height: 180
'''
dict2 = {"name": "Tom", 'age': 18, 'height': 180}

for a in dict2.keys():
    print(a + ": " + str(dict2[a]))

'''
name: Tom
age: 18
height: 180
'''
dict2 = {"name": "Tom", 'age': 18, 'height': 180}

for a in dict2.values():
    print(a)

'''
Tom
18
180
'''
dict2 = {"name": "Tom", 'age': 18, 'height': 180}

for k, v in dict2.items():
    print(str(k) + ": " + str(v))

'''
name: Tom
age: 18
height: 180
'''

参考

Python 字典 — dict