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

news2024/10/5 19:20:04

在这里插入图片描述

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_price

print(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) + 1

print(count_dict)

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ChatGPT助力高效办公——神奇的效率工具Airy

Airy是一款免费而又强大的高效办公软件,用户可以通过快捷键和丰富的内置插件,充分发挥GPT-3.5模型的强大功能,轻松实现搜索、翻译、文本生成与写作、文本概括与总结,同时还可以作为一款日程提醒工作,记录和提醒每天要做…

Linux编译器:gcc/g++的使用

我们在学习编译器时,我们不仅要只会使用编译器,还要理解程序的编译过程。一个程序存在两个不同的环境。第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令;第2种是执行环境,它用于实际执行代码。本篇文章将…

第十八章 Swing程序设计

Swing用于开发桌面窗体程序,是JDK的第二代GUI框架,其功能比JDK第一代GUI框架AWT更为强大、性能更加优良。但因为Swing技术推出时间太早,其性能、开发效率等不及一些其他流行技术,所以目前市场上大多数桌面窗体程序都不是由Java开发…

day18_多线程

今日内容 零、 复习昨日 一、作业 二、线程安全的集合 三、死锁 四、线程通信 五、线程池 零、 复习昨日 见晨考 一、线程安全[重点] 1.0 线程不安全 当前线程的数据被其他线程修改 1.1 线程安全 临界资源:共享资源(同⼀个对象),一次只可以有一个线程操…

JS-项目实战-代码优化-事件动态绑定

1、鼠标悬浮和离开事件.js //当页面加载完成后执行后面的匿名函数 window.onload function () {//get:获取 Element:元素 By:通过...方式//getElementById()根据id值获取某元素let fruitTbl document.getElementById("fruit_tbl");//table.rows:获取这个表格…

【Maven】进阶

文章目录 1. 聚合2. 继承3. 属性变量定义与使用4. 版本管理5. 资源配置6. 多环境配置7. 跳过测试(了解) 1. 聚合 为了防止某个模块(dao)更新了,重新编译了,导致和其他模块不兼容,需要用一个roo…

使用boost库

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:…

tsmc12 nm boundary cell注意事项

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 往期文章导读: boundary cell添加失败问题整理 注意N/P的区别 针对上下两边的boundary cell,有N/P类型的区别,看版图衬底形状上下是不对称的,而且P

深入理解SqueezeSegV3点云分割

文章:Squeezesegv3: Spatially-adaptive convolution for efficient point-cloud segmentation 代码:https://github.com/chenfengxu714/SqueezeSegV3 一、摘要 激光雷达点云分割是许多应用中的一个重要问题。对于大规模点云分割,一般是投…

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

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

vite => .env 文件配置和使用

.env.development .env.production VITE_API_BASE_URL /api # 开发环境代理地址 .env.development 是在开发环境中的代理地址 .env.production 是在线上的代理地址 ( 两个 .env 内部的变量都是一样的 vite 会在你开发环境和线上环境自动做切换 ) …

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

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

【华为内部资料】《高速数字电路设计教材》(可下载)

与数字技术或软件相比,模拟技术人才的培养和造就仍然需要一定的实践和时间,但无论数字技术发展到任何阶段将永远离不开模拟技术。 由于难度系数较大的原因,有时即便投入很多精力,如果缺乏耐心、毅力和必要的条件,投入…

猫罐头买什么牌子的?宠物店最受欢迎的5款猫罐头推荐!

有多少铲屎官为了让猫咪健康快乐的成长,在猫罐头上费尽心机。钱是砸进去了,但是自己猫胖的胖、瘦的瘦,甚至有的毛病多,出现身体各种问题。 作为一个经营宠物店7年的店长,某宝有大促的时候我总能捡漏,囤到一…

物联网AI MicroPython学习之语法 GPIO输入输出模块

学物联网,来万物简单IoT物联网!! GPIO 介绍 模块功能: GPIO通用输入输出。 接口说明 GPIO - 构建GPIO对象 函数原型:Pin(port, dir , pull)参数说明: 参数类型必选参数?说明portintY对应开发板的引脚号…

【论文精读】VOYAGER: An Open-Ended Embodied Agent with Large Language Models

Understanding LSTM Networks 前言Abstract1 Introduction2 Method2.1 Automatic Curriculum2.2 Skill Library2.3 Iterative Prompting Mechanism 3 Experiments3.1 Experimental Setup3.2 Baselines3.3 Evaluation Results3.4 Ablation Studies3.5 Multimodal Feedback from …

【MySQL】MVCC(多版本并发控制)详解

MVCC MVCC概述 MVCC,全称 Multi-Version Concurrency Control ,即多版本并发控制。MVCC 是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。 MVCC就是在ReadCommitte…

金蝶云星空表单插件获取控件值

文章目录 金蝶云星空表单插件获取控件值获取主键获取文本获取日期获取数值获取基础资料 金蝶云星空表单插件获取控件值 获取主键 正确: this.View.Model.GetPKValue();错误: 获取文本 this.View.Model.GetValue("FBILLNO")获取日期 thi…

一题带你写出图论算法模板!!!

这题是道基础的图论算法题目 注释很重要!!!!!!! 在做这道题之前,我们先了解一下基础的图论算法吧!!! 1.floyd: 这样可以求出所有点…

了解一下知识付费系统的开发流程和关键技术点

知识付费系统的开发既涉及到前端用户体验,又需要强大的后端支持和复杂的付费逻辑。在这篇文章中,我们将深入探讨知识付费系统的开发流程和关键技术点,并提供一些相关的技术代码示例。 1. 需求分析和规划: 在着手开发知识付费系…