Python 修仙修炼录 08:字典秘境,参悟键值玄机

目录

    • 一、字典概述
    • 二、创建字典
      • [1. 创建空字典](#1. 创建空字典)
      • [2. 创建字典的同时设置初始值](#2. 创建字典的同时设置初始值)
    • [三、查找 key](#三、查找 key)
      • [1. 使用 in / not in判断 key 是否存在](#1. 使用 in / not in判断 key 是否存在)
      • [2. 使用 [] 根据 key 获取 value](#2. 使用 [] 根据 key 获取 value)
    • [四、新增 / 修改 键值对](#四、新增 / 修改 键值对)
    • [五、使用 pop 方法删除键值对](#五、使用 pop 方法删除键值对)
    • 六、遍历字典
      • [1. 直接 for 循环遍历](#1. 直接 for 循环遍历)
      • [2. keys()、values()、items()](#2. keys()、values()、items())
    • [七、合法的 key 类型](#七、合法的 key 类型)

一、字典概述

字典是Python中存储键值对 的数据结构,根据key能够快速找到value。

字典中可以包含很多键值对,键(key)不能重复


二、创建字典

1. 创建空字典

  1. 直接使用花括号{}(最常用)
python 复制代码
a = {}
print(type(a))  # 输出:<class 'dict'>
  1. 使用 dict() 函数
java 复制代码
b = dict()
print(type(b)) # 输出:<class 'dict'>

2. 创建字典的同时设置初始值

字典中的key类型可以不同,value类型也可以不同。

字典对key的类型有约束,对value的类型没有约束。

python 复制代码
a = {
    'id': 1,
    'name': 'zhangsan',
     100:'lisi',
}

三、查找 key

1. 使用 in / not in判断 key 是否存在

in / not in 只判定 key 是否存在,和 value 无关

python 复制代码
a = {
    'id': 1,
    'name': 'zhangsan',
}
print('id' in a)        # 判断 key 'id' 是否在 字典a中,在返回True 不在返回False
print('classId' in a)   # 输出:False

print('classId' not in a)  # 输出:True
print('id' not in a)       # 输出:False

2. 使用 [] 根据 key 获取 value

字典的in[]都是高效操作 (因为字典背后使用了特殊的数据结构:哈希表)

列表的 in 效率低 (需要把整个列表遍历一遍),列表 [] 效率高(类似于数组/顺序表取下标)

key 不存在 会直接报错 KeyError

python 复制代码
a = {
    'id': 1,
    'name': 'zhangsan',
    100: 'lisi'
}
print(a['id'])      # 输出:1
print(a['name'])    # 输出:zhangsan
print(a[100])       # 输出:lisi
# print(a['classId'])  # KeyError: 'classId'

四、新增 / 修改 键值对

规则:

  • key 不存在 → 新增键值对
  • key 已存在 → 修改对应 value
    字典所有操作都是针对 key 进行

语法:字典[key] = 新值

python 复制代码
a = {
    'id': 1,
    'name': 'zhangsan',
}

# 新增键值对
a[100] = 'lisi'
print(a)  # {'id': 1, 'name': 'zhangsan', 100: 'lisi'}

# 修改键值对
a[100] = 'wangwu'
print(a)  # {'id': 1, 'name': 'zhangsan', 100: 'wangwu'}

五、使用 pop 方法删除键值对

字典的删除只针对 key ,最常用的方法是 pop(),传入要删除的 key 即可。

python 复制代码
student = {
    'id': 1,
    'name': 'zhansan',
    100: 'wangwu'
}

# 删除 key='name' 对应的键值对
student.pop('name')
print(student)  # 输出:{'id': 1, 100: 'wangwu'}

六、遍历字典

字典设计初衷是高效增删改查,遍历效率稍差

Python 字典遍历顺序 = 插入顺序(不是纯哈希表,做了特殊处理)

1. 直接 for 循环遍历

for 循环直接遍历字典,默认遍历的是所有 key,再通过 key 取 value。

python 复制代码
a = {
    'id': 1,
    'name': 'zhangsan',
    100: 'lisi'
}
for key in a:
    print(key, a[key])
# 输出:
# id 1
# name zhangsan
# 100 lisi

在C++或者Java中,哈希表里面的键值对存储的顺序,是无序的!

但是在Python中还不一样 Python中做了特殊处理 能够保证遍历出来的顺序,就是和插入的顺序一致的!!

Python中的字典,又不是一个单纯的哈希表

2. keys()、values()、items()

  1. 遍历所有 key:keys()
python 复制代码
a = {
    'id':1,
    'name':'zhangsan',
    100:'lisi'
}
print(a.keys())    # dict_keys(['id', 'name', 100])

返回的结果,看起来像列表,又不完全是 自定义的类型

使用的时候也可以把它当做一个列表来使用

  1. 遍历所有 value:values()
python 复制代码
a = {
    'id':1,
    'name':'zhangsan',
    100:'lisi'
}
print(a.values())  # dict_values([1, 'zhangsan', 'lisi'])
  1. 遍历所有键值对:items()(最常用)
    首先是一个列表一样的结构,里面每个元素又是一个元组,元组里面包含了键和值
python 复制代码
a = {
    'id':1,
    'name':'zhangsan',
    100:'lisi'
}
print(a.items())   # dict_items([('id', 1), ('name', 'zhangsan'), (100, 'lisi')])

七、合法的 key 类型

可使用 hash() 函数判断是否可作为 key

  • 不可变对象 → 可哈希 → 可以做 key
  • 可变对象 → 不可哈希 → 不能做 key
python 复制代码
# 可哈希(可以做 key)
print(hash(0))        # 0
print(hash(3.14))     # 3228180523291329
print(hash('hello'))  # 哈希值(每次运行不同)
print(hash(True))     # 1
print(hash((1, 2, 3)))# 哈希值

# 不可哈希(不能做 key)
# print(hash([1, 2, 3]))  # TypeError: unhashable type: 'list'
# print(hash({}))         # TypeError: unhashable type: 'dict'
相关推荐
凌波粒1 小时前
深度学习入门(鱼书)第1章笔记——Python 基础
笔记·python·深度学习
luck_bor1 小时前
Map&Stream流
java·开发语言
阿文的代码库1 小时前
如何在C++中使用标准库的智能指针
开发语言·c++·算法
一只机电自动化菜鸟1 小时前
一建机电备考笔记(38) 焊接技术—焊接质量检验(含考频+题型)
笔记·学习·职场和发展·生活·学习方法
yujunl1 小时前
U9客开Demo代码中的错误
开发语言
郝学胜-神的一滴1 小时前
Qt 高级开发 008: 使用QSetting记住上次打开路径
开发语言·c++·qt·开源软件
WL_Aurora1 小时前
Python 算法基础篇之查找算法(三):树表查找
python·算法
_洋1 小时前
Three.js 着色器相关方法总结
开发语言·javascript·着色器
aini_lovee1 小时前
MATLAB 基于多层编码遗传算法的车间调度优化
开发语言·matlab