Python数据结构:字典(dict)详解

在这里插入图片描述

1.字典概念

  字典在其他语言中可能会被称为“关联存储”或“关联数组”。
  在Python中,字典(Dictionary)是一种可变、无序且键值对(key-value pairs)唯一的数据结构。
  字典也是一种标准映射类型,mapping对象会将hashtable值映射到任意对象,映射属于可变对象。
  字典的键 几乎可以为任何不可变类型。 不是 hashable的值,即包含列表、字典或其他可变类型(按值比较而非按对象标识比较)的值不可被用作键。字符串或数字总是可以作为键。如果一个元组只包含了字符串、数字或元组则可以作为键;如果元组直接或间接的包含了任何可变对象,则不能作为键。

2.字典创建

  字典可以用多种方式进行创建,一般使用{}内用,隔开 键:值对的方式、字典推导式、dict()构造函数等。
  注意:
  如果没有给出位置参数,将创建一个空字典。
  如果给出一个位置参数并且其属于映射对象,将创建一个具有与映射对象相同键值对的字典。
  否则的话,位置参数必须为一个iterable 对象。该可迭代对象中的每一项本身必须为一个刚好包含两个元素的可迭代对象。每一项中的第一个对象将成为新字典的一个键,第二个对象将成为其对应的值。
如果一个键出现一次以上,该键的最后一个值将成为其在新字典中对应的值。
  如果给出了关键字参数,则关键字参数及其值会被加入到基于位置参数创建的字典。如果要加入的键已存在,来自关键字参数的值将替代来自位置参数的值。
my_dict = {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}

# 创建空字典
empty_dict1 = {}
empty_dict2 = dict()dict1 = {'one':1,'two':2,'three':4} # 输出 {'one': 1, 'two': 2, 'three': 4}
dict2 = dict(one=1,two=2,three=4) # 输出 {'one': 1, 'two': 2, 'three': 4}
dict3 = dict(zip(['one','two','three'],[3,4,5])) # 输出 {'one': 3, 'two': 4, 'three': 5}
dict4 = dict({'one':1,'two':3,'three':4}) # 输出 {'one': 1, 'two': 3, 'three': 4}
dict5 = dict({'one':2,'three':4} , two=6) # 输出 {'one': 2, 'three': 4, 'two': 6}
dict6 = dict([('two',3),('three',6),('one',8)]) # 输出 {'two': 3, 'three': 6, 'one': 8}
dict7 = {x:x**2 for x in (2,4,6)} # 输出 {2: 4, 4: 16, 6: 36}

3. 字典常用方法

  以下表格列出了字典常用的一些方法,下面通过示例进行说明。
在这里插入图片描述

3.1 keys()

  用于返回一个包含字典所有键的可迭代对象。这个可迭代对象实际上是一个视图(view),称为字典键视图(dict_keys

"""keys 就是一个包含字典中所有键的视图。字典视图是动态的,即当字典发生变化时,视图会自动更新。可以将该视图转换为列表或其他数据类型
"""
dict_fruits = {'fruit1':'apple','fruit2':'banana','fruit3':'pear'}
keys = dict_fruits.keys()
print(f'输出的为字典键视图:{keys}') # 输出 dict_keys(['fruit1', 'fruit2', 'fruit3'])list_keys = list(keys) # 将字典键视图转换为列表
print(f'转换为list后的keys:{list_keys}')

3.2 values()

  用于返回一个包含字典所有值的可迭代对象。类似于 dict.keys() 返回的是一个字典键的视图,dict.values() 返回的是字典值的视图,称为字典值视图(ict_values)。

"""values 就是一个包含字典中所有值的视图。字典视图是动态的,即当字典发生变化时,视图会自动更新。可以将该视图转换为列表或其他数据类型
"""
dict_fruits = {'fruit1':'apple','fruit2':'banana','fruit3':'pear'}
values = dict_fruits.values()
print(f'输出的为字典值视图:{values}')list_values = list(values) # 将字典值视图转换为列表
print(f'转换为list后的values:{list_values}')

3.3 items()

  用于返回一个包含字典所有键值对的可迭代对象。这个可迭代对象实际上是字典项视图(dict_items)。

dict_fruits = {'fruit1':'apple','fruit2':'banana','fruit3':'pear'}
items = dict_fruits.items()
print(f'输出的为字典项视图:{items}')list_items = list(values) # 将字典项视图转换为列表
print(f'转换为list后的items:{list_items}')# 该方法多用于遍历字典的键值对
for key,value in dict_fruits.items():print(f'key = {key},value = {value}')# 判断键值对是否存在字典中
if('fruit1','apple') in dict_fruits.items():print(f'键值对(fruit1,apple)在 dict_fruits 中')

3.4 get(key, default=None)

  是用于获取指定键的值。如果字典中存在指定的键,则返回该键对应的值;如果字典中不存在指定的键,则返回指定的默认值。
  在不确定字典中是否包含某个键的情况下,可以避免因为键不存在而引发的异常,通过提供默认值,可以更加灵活地处理字典中的数据。

dict_fruits = {'fruit1':'apple','fruit2':'banana','fruit3':'pear'}
# 获取存在的键的值
value1 = dict_fruits.get('fruit1')
print(f'字典存在的key值:{value1}') # 输出 apple# 获取不存在的键的值,使用默认值
value2 = dict_fruits.get('fruit00','不存在')
print(f'键的值存在情况:{value2}') # 输出 不存在# 不提供默认值,键不存在时返回None
value3 = dict_fruits.get('fruit99')
print(f'键的值存在情况:{value3}') # 输出 None

3.5 pop(key, default=None)

  用于删除指定键并返回对应的值。如果字典中存在指定的键,则该键值对被移除,并返回该键对应的值;如果字典中不存在指定的键,则返回指定的默认值(如果提供了默认值),否则引发 KeyError 异常。

dict_fruits = {'fruit1':'apple','fruit2':'banana','fruit3':'pear'}
# 删除存在的键,并返回其值
value1 = dict_fruits.pop('fruit2')
print(f'被删除的值为:{value1}') # 输出 banana# 删除不存在的键,返回默认值
value2 = dict_fruits.pop('fruit00','不存在')
print(f'键存在情况:{value2}') # 输出 不存在# 删除不存在的键,不提供默认值,引发 KeyError 异常
value2 = dict_fruits.pop('fruit00') # 引发 KeyError: 'fruit00'

3.6 popitem()

  用于随机删除并返回字典中的一对键值对。在 Python 3.7 及以上的版本中,删除的是字典中的最后一对键值对。在之前的版本中,字典是无序的,所以不能确定删除的是哪一对键值对。

dict_fruits = {'fruit1':'apple','fruit2':'banana','fruit3':'pear'}
item = dict_fruits.popitem()
print(f'被删除的是最后的一对键值对:{item}')
print(f'剩下的字典为:{dict_fruits}')

3.7 update(iterable)

  用于使用可迭代对象中的键值对更新字典。这个方法会将可迭代对象中的键值对添加到字典中,如果键已经存在,则更新对应的值。

dict_fruits = {'fruit1':'苹果','fruit2':'香蕉'}
# dict_fruits_2 = {'水果3':'李子','水果4':'杏子'}
# dict_fruits.update(dict_fruits_2) 直接更新字典类型的也可以
print(dict_fruits)
dict_fruits.update([('fruit3','梨子'),('fruit4','山竹')])
print(f'添加2个键值对后的字典:{dict_fruits}')
dict_fruits.update({'fruit5':'车厘子','fruit4':'榴莲'})
print(f'键存在的更新对应的值后的字典:{dict_fruits}')

3.8 clear()

  用于清空字典,即删除字典中的所有键值对,使其变为空字典。

dict_fruits = {'fruit1':'苹果','fruit2':'香蕉'}# 清空字典
dict_fruits.clear()
print(f'字典已被清空,变为空字典:{dict_fruits}')

3.9 len(dict)

  是一个内建函数,用于返回字典(dict)中键值对的数量,即字典的长度。

dict_fruits = {'fruit1': '苹果', 'fruit2': '香蕉', '水果3': '李子', '水果4': '杏子'}# 获取字典的长度
dict_fruits_len = len(dict_fruits)
print(f'字典中的键值对数量:{dict_fruits_len}个')

3.10 key in dict

  是一个成员运算符,用于检查字典(dict)中是否存在指定的键。如果键存在,表达式返回True,否则返回False

dict_fruits = {'fruit1': '苹果', 'fruit2': '香蕉', '水果3': '李子', '水果4': '杏子'}
return_True = '水果3' in dict_fruits
print(f'字典中存在水果3的键:{return_True}')return_Flase = '水果99' in dict_fruits
print(f'字典中存在水果99的键:{return_Flase}')

4. 字典的应用场景

  字典在各个应用场景中有丰富的使用,包括学生信息管理在线购物任务管理URL路由映射配置管理数据存储API请求和响应数据库查询结果用户身份验证和授权数据统计等。字典的结构可以根据实际需求进行灵活设计,适用于各种数据管理和组织的场景。

4.1 学生信息管理系统

# 学生信息管理系统
students = {'john_doe': {'name': 'John Doe', 'age': 20, 'grades': [90, 85, 88]},'jane_smith': {'name': 'Jane Smith', 'age': 22, 'grades': [95, 92, 96]}
}# 获取学生信息
student_id = 'john_doe'
student_info = students.get(student_id, {})
print(f"Student ID: {student_id}")
print(f"Name: {student_info.get('name', 'N/A')}")
print(f"Age: {student_info.get('age', 'N/A')}")
print(f"Grades: {student_info.get('grades', 'N/A')}")

4.2 在线商店购物车

# 在线商店购物车
shopping_cart = {'user_id': 123,'items': [{'product_id': 1, 'name': 'Product A', 'price': 29.99, 'quantity': 2},{'product_id': 2, 'name': 'Product B', 'price': 39.99, 'quantity': 1}],'total': 99.97
}# 添加新商品到购物车
new_item = {'product_id': 3, 'name': 'Product C', 'price': 19.99, 'quantity': 3}
shopping_cart['items'].append(new_item)# 计算新的总价
total_price = sum(item['price'] * item['quantity'] for item in shopping_cart['items'])
shopping_cart['total'] = total_priceprint(shopping_cart)

4.3 任务管理系统

# 任务管理系统
tasks = {'task1': {'title': 'Complete report', 'status': 'In Progress', 'assignee': 'John'},'task2': {'title': 'Code review', 'status': 'Pending', 'assignee': 'Jane'},'task3': {'title': 'Testing', 'status': 'Completed', 'assignee': 'Bob'}
}# 更新任务状态
task_id = 'task2'
tasks[task_id]['status'] = 'Completed'# 打印更新后的任务列表
for task_id, task_info in tasks.items():print(f"Task ID: {task_id}")print(f"Title: {task_info['title']}")print(f"Status: {task_info['status']}")print(f"Assignee: {task_info['assignee']}")print("\n")

4.4 URL路由映射

# URL路由映射
url_mapping = {'/home': 'home_handler','/about': 'about_handler','/contact': 'contact_handler'
}# 处理请求
requested_url = '/home'
handler = url_mapping.get(requested_url, 'default_handler')
print(f"Handling {requested_url} with {handler}")

4.5 配置管理

# 配置管理
config = {'database': {'host': 'localhost', 'port': 3306, 'username': 'admin', 'password': 'admin123'},'app': {'debug_mode': True, 'timezone': 'UTC'}
}# 获取数据库配置
db_config = config.get('database', {})
print(f"Database Host: {db_config.get('host', 'N/A')}")
print(f"Database Port: {db_config.get('port', 'N/A')}")
print(f"Database Username: {db_config.get('username', 'N/A')}")

4.6 数据存储

# 数据存储
user_data = {'user1': {'name': 'John', 'email': 'john@example.com', 'age': 25},'user2': {'name': 'Jane', 'email': 'jane@example.com', 'age': 28}
}# 获取用户信息
user_id = 'user1'
user_info = user_data.get(user_id, {})
print(f"User ID: {user_id}")
print(f"Name: {user_info.get('name', 'N/A')}")
print(f"Email: {user_info.get('email', 'N/A')}")
print(f"Age: {user_info.get('age', 'N/A')}")

4.7 API请求和响应

# API请求和响应
api_request = {'method': 'GET', 'url': 'https://api.example.com', 'params': {'page': 1, 'limit': 10}}
api_response = {'status': 200, 'data': {'user': 'John', 'age': 25}}# 处理API响应
if api_response['status'] == 200:user_data = api_response['data']print(f"User: {user_data['user']}, Age: {user_data['age']}")
else:print(f"Error: {api_response['status']}")

4.8 数据库查询结果

# 数据库查询结果
db_result = {'id': 1, 'name': 'Product A', 'price': 29.99}# 处理查询结果
print(f"Product ID: {db_result['id']}")
print(f"Product Name: {db_result['name']}")
print(f"Product Price: {db_result['price']}")

4.9 用户身份验证和授权

# 用户身份验证和授权
user_info = {'username': 'john_doe', 'password_hash': 'hashed_password', 'role': 'admin'}# 身份验证
input_username = 'john_doe'
input_password = 'password123'
if input_username == user_info['username'] and input_password == 'password123':print("Authentication successful.")# 检查用户权限if user_info['role'] == 'admin':print("Admin access granted.")else:print("Regular user access granted.")
else:print("Authentication failed.")

4.10 数据统计

# 数据统计
data = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple']# 统计元素出现次数
count_dict = {}
for item in data:count_dict[item] = count_dict.get(item, 0) + 1print(count_dict)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/178615.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

彩虹桥架构演进之路-性能篇

一、前言 一年前的《彩虹桥架构演进之路》侧重探讨了稳定性和功能性两个方向。在过去一年中,尽管业务需求不断增长且流量激增了数倍,彩虹桥仍保持着零故障的一个状态,算是不错的阶段性成果。而这次的架构演进,主要分享一下近期针对…

9步打造个人ip

什么是个人IP? 就是一个人创造出来的属于自己的有个性有价值的,能让他人记住你,信任你,认可你的东西。 如何强化个人IP呢? 需要一些必要的条件如专业性、耐心、勤奋等等要知道,打造IP是一个见效慢的过程&am…

零代码数字孪生设计平台的功能特点

在当今数字化的时代,企业的转型已经成为必然的趋势。而在这个过程中,3D数字孪生无代码编辑工具正成为企业实现数字化转型的新价值点。客户可以无需任何专业知识和专业软件的支持,仅仅通过互联网和浏览器即可根据购买要求对自己的产品/设备/园…

Ubuntu18.04平台下Qt开发程序打包的一些问题总结

目录 前言 一、在Ubuntu18.04开发环境下打包有两种方式 1、利用linuxdeployqt软件进行打包 2、利用编写shell脚本的方式进行打包 二、详细介绍shell脚本打包的方式 1、新建一个空的文件夹 2、准备脚本copylib.sh 3、准备脚本xxxx.sh。 4、给上述两个脚本添加可执行权限…

单相过压继电器DVR-G-100-1 0~500V AC/DC220V 导轨安装

系列型号 DVR-G-100-1X3数字式过压继电器; DVR-G-100-3三相过压继电器; DVR(H)-G-100-1单相过压继电器; DVR-Q-100-3三相欠压继电器; DVR(H)-Q-100-3三相欠压继电器 一、用途 主要应用于电机、变压器等主设备以及输配电系统的继…

全数字系列-麦克风K歌模组-搭配投影仪专业方案

麦克风学名传声器,是将声音信号转换为电信号的能量转换器件,也称话筒、微音器;主要包括拾音面和信号放大电路;利用微机械加工技术制作出来的电能换声器,具有体积小、频响特性好、噪声低、高集成度和适于大批量生产的特…

使用naive-ui做一个标签页展示列表

目录 零、引言 一、引入所需组件 二、引入数据 三、使用动态样式控制列表条纹 四、全部代码 五、设计思路 5.1组件设计思路 5.2背景颜色控制思路 5.3说明 六。最终效果 零、引言 有时候我们会有很多数据,分成好几类 每一类都需要展示,那么这时…

vue3 tsx 项目中使用 Antv/G2 实现多线折线图

Antv/G2 文档 Antv/G2 双折线图 安装依赖 项目中安装 antv/g2 依赖库: npm install antv/g2 --save安装成功: 项目使用 新建文件 IndicatorTrend.tsx: import { defineComponent, PropType, onMounted, ref } from vue import { useCh…

全网最全指南:什么是产品手册?又该如何编写呢?

如果你想提高对用户的支持,优先制作产品的产品手册至关重要。事实上,如果用户不知道如何使用你的产品,他们很可能会失去兴趣。用户通常在向客户寻求帮助之前会参考产品手册,因此你的手册是一个宝贵的资源,可以帮助降低…

算法通关村——归并排序

归并排序 1、归并排序原理 ​ 归并排序是一种很经典的分治策略。 ​ 归并排序(MERGE-SORT)简单来说就是将大的序列先视为若干小的数组,分成几个比较小的结构,然后是利用归并的思想实现的排序方法。将一个大的问题分解成一些小的问题分别求解&#xff…

基于ssm流浪动物救助管理系统

基于ssm流浪动物救助管理系统 摘要 随着城市化的不断发展,流浪动物问题逐渐凸显,而对流浪动物的救助和管理成为社会关注的焦点。本文基于SSM(SpringSpringMVCMyBatis)框架,设计并实现了一套流浪动物救助管理系统。该系…

EasyPOI实现excel文件导出

EasyPOI真的是一款非常好用的文件导出工具&#xff0c;相较于传统的一行一列的数据导出&#xff0c;这种以实体类绑定生成的方式真的非常方便&#xff0c;也希望大家能够了解、掌握其使用方法&#xff0c;下面就用一个实例来简单介绍一下EasyPOI的使用。 1.导入依赖 <!-- e…