字典是另一种可变容器模型,且可存储任意类型对象,可以看成基于集合的映射。
字典的每个键值对(key:value)对用冒号(:)分隔,每个对之间用逗号(,)分隔,整个字典包括在花括号({})中,格式如下所示:
d = {key1 : value1, key2 : value2 }注意:键必须是唯一的,但值则不必
值可以取任何数据类型,但键必须是不可变的且唯一,如何字符串、数值或元组。
字典推导式
my_dict = {"name": "Alice", "age": 25, "city": "New York"}# 获取所有键值对,其中值大于 20filtered_dict = {k: v for k, v in my_dict.items() if isinstance(v, int) and v>20}print(filtered_dict) # 输出: {'age': 25}
基本功能是进行关系映射、成员计数,基于集合的去重。
使用键直接访问
用中括号放入存在的键来取值,如果键不存在字典中会报错
dict_data = {"name":"zkx","age":7,"class":"first"}print(dict_data["name"]) #输出:zkxprint(dict_data["sex"]) #报错
注意:如果键不存在,会抛出KeyError
使用get()方法
get()方法可以安全地访问字典中的值,即使键不存在也不会抛出异常。不存在时还可以返回指定默认值,默认为None。
dict_data = {"name":"zkx","age":24}print(dict_data.get("name")) #返回zkxprint(dict_data.get("class")) #返回Noneprint(dict_data.get("class","不详")) #返回不详
使用keys()和values()方法
访问字典所有的键用keys()方法,访问字典所有的值用values()方法。
dict_data = {"name":"zkx","age":24}print(dict_data.keys()) #返回 dict_keys(["name","age"])print(dict_data.values()) #返回 dict_values(["zkx",24])
使用items()方法
访问字典所有键值对的视图对象用items(),可以用于遍历字典。
dict_data = {"name":"zkx","age":24}for key,value in dict_data.items():print(f"{key}:{value}")
使用in操作符
检查某个键是否存在字典中,可以用in操作符
my_dict = {"name": "Alice", "age": 25}# 检查键是否存在if "name" in my_dict:print("Key 'name' exists")else:print("Key 'name' does not exist")# 输出: Key 'name' exists
使用setdefault()方法
setdefault()方法用于获取字典中的值,如果键不存在,则会插入一对键值对,值默认为None。用于判断键不存在字典中,插入新键新值
my_dict = {"name": "Alice", "age": 25}# 使用 setdefault() 获取值city = my_dict.setdefault("city", "Unknown")print(city) # 输出: Unknown# 同时也插入了一对city:Unknown# 再次调用时,不会修改值city = my_dict.setdefault("city", "New York")print(city) # 输出: Unknownprint(my_dict) # 输出: {'name': 'Alice', 'age': 25, 'city': 'Unknown'}
my_dict = {"name": "Alice", "age": 25}# 增加新键my_dict["sex"] = "男"# 修改旧键值my_dict["name"] = "zkx"# 使用 setdefault() 获取值,键不存在时等同于添加新键值对city = my_dict.setdefault("city", "Unknown")print(city) # 输出: Unknown# 同时也插入了一对city:Unknown# 再次调用时,不会修改值city = my_dict.setdefault("city", "New York")print(city) # 输出: Unknownprint(my_dict) # 输出: {'name': 'Alice', 'age': 25, 'city': 'Unknown'}
注意:字典在迭代循环过程中不能修改其长度,迭代结束后可以修改其长度大小!
能删除单一的元素也能清空字典,清空只需一项操作。
#!/usr/bin/python3dict = {'Name': 'Nowcoder', 'Age': 7, 'Class': 'First'}del dict['Name'] # 删除键 'Name'dict.clear() # 清空字典del dict# 删除字典print ("dict['Age']: ", dict['Age'])print ("dict['School']: ", dict['School'])
但这会引发一个异常,因为用执行 del 操作后字典不再存在
注:del()方法后面还会讨论
关系映射
对于有多个字段的数据,打印出来可以先用字典存储,然后再拼接可以避免使用多个print()函数。也可以作为多条件判断
dict_info = {"字段1": "","字段2": "", ...}...dict_info["字段1"] = 赋值更新实际数据..row_info = ""for k,v in dict_info.item():row_info += f"{k}:{v}\n"print(row_info)
字典映射判断(动态多条件)
dict_info = {1:'高',2:'中','3':'低'}value = dict_info[1]level = dict_info.get(2,'不详')
字典去重计数
字典的的键具有唯一性,所以用字典的键不仅可以去重还能用值记录其次数,比单纯的集合去重多了计数和有序性。
代码示例如下:
lt = list("abasjkfhjahfkahsaobxjbjksfawas")count_dict = {}# 去重并计数for i in lt:if i in count_dict:count_dict[i] += 1else:count_dict[i] = 1print(count_dict)
一行去重
import retext = ",,1690/1690,,"# 一行代码实现result = list(dict.fromkeys(re.findall(r'\d+\.?\d*', text)))print(f"一行代码结果: {result}")
| 部分 | 功能 | 说明 |
|---|---|---|
re.findall() | 提取所有数字 | 返回包含所有匹配项的列表 |
r'\d+\.?\d*' | 正则表达式 | 匹配整数和小数 |
dict.fromkeys() | 去重 | 利用字典键的唯一性 |
list() | 转换类型 | 将字典键转换为列表 |
字典扩展排序
# 根据值item[1]排序字典项,reverse=True降序,reverse=False升序sorted_items = sorted(count_dict.items(), key=lambda item: item[1],reverse=True)# 将排序后的项转换回字典sorted_dict = dict(sorted_items)print(sorted_dict)# 根据键item[0]排序字典项,reverse=True降序,reverse=False升序sorted_items = sorted(count_dict.items(), key=lambda item: item[0],reverse=True)# 将排序后的项转换回字典sorted_dict = dict(sorted_items)print(sorted_dict)
字典枚举
for index, (k, v) in enumerate(sorted_dict.items()):print(index, k, v)
sorted(d.items()) 会按键排序(默认升序)返回一个由 (key, value) 组成的列表,然后 enumerate 为每个元素加上索引
字典倒叙
一次性反转(最简洁)
d = {'a': 1, 'b': 2, 'c': 3}d_rev = dict(reversed(list(d.items()))) # {'c': 3, 'b': 2, 'a': 1}
遍历级反转(节省内存)
for k, v in reversed(d.items()):print(k, v)
只按键倒序(值保持原位置)
d_by_key = {k: d[k] for k in sorted(d, reverse=True)}按值倒序(常用于排序输出)
d_by_val = dict(sorted(d.items(), key=lambda kv: kv[1], reverse=True)) 一句话总结dict(reversed(d.items())) 即可得到“倒序字典”; 遍历用 for k, v in reversed(d.items()): 零拷贝。
Python 的字典支持多种操作符,用于访问、修改、比较、合并、删除和清空字典。这些操作符提供了强大的功能,可以满足大多数字典操作的需求。以下是总结:
| 操作符 | 功能 | 示例 |
|---|---|---|
[] | 访问字典中的值 | dict[key] |
| = | 添加或修改键值对 | dict[key]=value |
| in | 检查键是否存在 | key in dict |
| not in | 检查键是否不存在 | key not in dict |
| == | 比较两个字典是否相等 | dict1 == dict2 |
| != | 比较两个字典是否不相等 | dict1 != dict2 |
| | | 合并两个字典 | dict1|dict2 |
| |= | 合并更新字典 | dict1|=dict2 |
| del | 删除键值对或字典 | del dict[key] |
| clear() | 清空字典 | dict.clear() |
字典值可以是任何类型的python对象,既可以是标准的对象,也可以是用户定义的,但是键不行。
键的特性
唯一性:一个键被赋值两次,值会被覆盖更新
不可变类型:可以用字符串、元组或数值,但是不能列表这些
全局函数(与字典相关)
1、len():计算字典元素个数,即键的总数
2、str():字典转换为字符串
3、type:返回数据类型
内置方法
dict[key] = value:添加或更新键值对。
del dict[key]:删除键值对。
dict.pop(key, default=None):删除并返回键值对。
dict.popitem():删除并返回最后一对键值对。
dict.clear():清空字典。
dict.get(key, default=None):获取键的值。
key in dict:检查键是否存在。
dict.keys():返回所有键的视图。
dict.values():返回所有值的视图。
dict.items():返回所有键值对的视图。
dict.update(other):更新字典。
dict1 | dict2:合并字典(Python 3.9+)。
dict1 |= dict2:更新字典(Python 3.9+)。
dict.fromkeys(keys, value=None):创建新字典。
dict.setdefault(key, default=None):设置默认值。