当前位置: 首页 > news >正文

Python从入门到精通——第六章 字典与集合

一.字典的创建与访问

        字典(Dictionary)是Python中一种非常常用的数据结构,它存储键值对(key-value pairs),具有高效的查找能力。

(一)创建字典

1.直接创建字典

        将若干组“键值对”放在一对大括号“{}”中即可直接创建一个字典。

语法格式:

{键1:值1,键2:值2}

示例:

# 创建空字典
empty_dict = {}# 创建有内容的字典
person = {"name": "Alice","age": 25,"city": "New York"
}

2.使用内置函数dict()创建字典

        字典存储的是“键”与“值”之间一一对应的关系,因此Python语言也支持将一组双元素序列转换为字典。这需要使用内置函数dict()。

# 创建空字典
empty_dict = dict()# 使用关键字参数创建
person = dict(name="Bob", age=30, city="London")# 从键值对序列创建
person = dict([("name", "Charlie"), ("age", 35), ("city", "Paris")])

【注意】

(1)键具有唯一性,字典中不允许出现相同的键,但是不同的键允许对应相同的值。

(2)字典中的键必须是不可变的类型,一般是字符串、数字或者元组;而值却可以是任何数据类型。

(二)访问字典

        字典中存储了若干条目,但是都是无序的。这意味着字典没有索引的概念,它不通过索引访问条目,而是通过键访问条目。

语法格式:

字典名[键]

示例:

person = {"name": "Alice", "age": 25, "city": "New York"}# 访问存在的键
print(person["name"])  # 输出: Alice# 访问不存在的键会引发KeyError
# print(person["job"])  # 会引发KeyError

二.字典的基本操作

        字典存放的是数据与数据之间的映射关系,对应的条目是“键值对”。所以,字典的操作都会涉及“键”和“值”两个部分。

(一)空字典与字典更新

1.添加条目

        给字典添加条目即添加一对新的“键值对”,只要通过如下的赋值语句完成“值”与“键”的映射就可以。

语法格式:

字典名[键]=值

示例:

my_dict = {"name": "Alice", "age": 25}
my_dict["city"] = "New York"  # 添加新的键值对
print(my_dict)  # 输出: {'name': 'Alice', 'age': 25, 'city': 'New York'}

2.修改条目

语法格式:

字典名[键]=值

示例:

my_dict = {"name": "Alice", "age": 25}
my_dict["age"] = 26  # 更新已有键的值
print(my_dict)  # 输出: {'name': 'Alice', 'age': 26, 'city': 'New York'}

        对照添加条目和修改条目的示例代码段可以看出,赋值语句“字典名[键]=值”是一个双重操作,当其中的键在字典中不存在时,执行的是添加条目的操作;键在字典中存在时就执行修改条目的操作。

(二)删除字典条目

        当字典中的条目不再需要的时候,就需要用到字典的删除操作。Python语言提供了多种命令和方法来实现字典的删除,但是都需要通过键来指定要删除的条目。

1.使用del命令删除指定条目

语法格式:

del 字典名[键]

示例:

my_dict = {"name": "Alice", "age": 25, "city": "New York"}# 删除指定键的条目
del my_dict["age"]
print(my_dict)  # 输出: {'name': 'Alice', 'city': 'New York'}

2.使用pop()方法删除指定条目

语法格式:

字典名.pop(键,默认值)

        字典的pop()方法与在列表中介绍的类似,它在闪电湖指定键的对应条目时也会“弹出”(即返回)一个值。如果指定的键在字典中存在,pop()方法弹出键对应的值;如果键不存在,则弹出默认值。

示例:

my_dict = {"name": "Alice", "age": 25, "city": "New York"}# 删除并获取指定键的值
age = my_dict.pop("age")
print(age)  # 输出: 25
print(my_dict)  # 输出: {'name': 'Alice', 'city': 'New York'}

【注意】

(1)当不确定指定的键在字典中是否存在时,需要给出默认值,否则删除字典中不存在的条目时系统会报错。

(2)使用pop()方法时,最少要包含一个用于指定键的参数,如果参数都缺省的话,系统会报错。

3.用popitem()方法随机删除字典条目

语法格式:

字典名.popitem()

示例:

my_dict = {"name": "Alice", "age": 25, "city": "New York"}# 删除并返回一个键值对
item = my_dict.popitem()
print(item)  # 可能是 ('city', 'New York')
print(my_dict)  # 剩余的字典内容

        从上述的示例可以看出,删除的条目会以元组的形式返回。

popitem()方法与pop()方法的区别:

特性popitem()pop()
参数不需要参数需要指定key参数
返回值返回 (key, value) 元组只返回value
删除方式删除最后插入项(Python 3.7+)删除指定key的项
空字典处理引发KeyError如果key不存在可能引发KeyError

4.用clear()方法清空字典条目

语法格式:

字典名.clear()

示例:

my_dict = {"name": "Alice", "age": 25, "city": "New York"}# 清空字典
my_dict.clear()print(my_dict)  # 输出: {}
print(len(my_dict))  # 输出: 0

               如果虚伪删除字典中的所有条目,可以执行多次del命令,或者多次调用pop()和popitem()方法。也可以直接调用clear()方法一次性清空字典。

        调用了clear()方法的字典虽然删除了所有的条目,但依然是一个字典(一个空字典)。后续可以继续采用添加条目的方式向其中增加新的内容。

5.直接删除整个字典

语法格式:

del 字典名

示例:

my_dict = {"name": "Alice", "age": 25, "city": "New York"}# 删除整个字典
del my_dict# 尝试访问已删除的字典会引发错误
print(my_dict)  # 引发 NameError: name 'my_dict' is not defined

        前面介绍的clear()方法清空了字典中的条目,但是保留了字典的结构。而“del 字典名”操作却会直接删除字典本身,即从内存中注销掉该字典对象。

(三)查找字典条目

1.成员运算符in

语法格式:

键 in 字典

示例:

        在查找对应条目前可以先试用in运算符确认指定的键是否在字典中,如果存在,则运算结果为True;如果不存在,则运算结果为False。

my_dict = {"name": "Alice", "age": 25, "city": "New York"}# 检查键是否存在
print("name" in my_dict)    # 输出: True
print("country" in my_dict) # 输出: False

2.用get()方法获取条目的值

语法格式:

字典名.get(键,默认值)

示例:

        get()方法按照指定的键访问字典中对应条目的值,如果指定的键在字典中不存在,则返回默认值。

my_dict = {"name": "Alice", "age": 25, "city": "New York"}# 获取存在的键
print(my_dict.get("name"))  # 输出: Alice# 获取不存在的键
print(my_dict.get("country"))  # 输出: None

三.字典的整体操作

(一)字典的遍历

1.遍历字典中所有的键

        字典有一个称为keys()的方法,可以用来返回字典中所有的键。keys()方法配合for循环一起使用时就可以遍历字典中每一个键。

my_dict = {"name": "Alice", "age": 25, "city": "New York"}# 方法1:直接遍历字典(默认遍历键)
for key in my_dict:print(key)# 方法2:使用keys()方法
for key in my_dict.keys():print(key)

输出:

name
age
city

        通过keys()方法可以遍历字典中所有的键,也可以通过键与值的映射访问对应的值,从而遍历所有的条目信息。

2.遍历字典中所有的值

        与keys()方法相对应,字典也提供了一个用来返回所有值的方法values()。同样地,values()方法配合for循环一起使用就可以遍历字典中所有的值。

# 使用values()方法
for value in my_dict.values():print(value)

输出:

Alice
25
New York

        借助values()方法虽然可以遍历出字典中所有的值,但是值却无法映射到对应的键,因而无法便利完整的条目信息。

3.遍历字典中所有的条目

        keys()方法和values()方法只能单独给出自己的键或者值的内容,而字典的items()方法却能以“(键,值)”的形式返回所有的条目。

# 使用items()方法
for key, value in my_dict.items():print(f"{key}: {value}")

输出:

name: Alice
age: 25
city: New York

(二)字典的排序

        字典本身是无序的或保持插入顺序,但我们可以通过多种方式对字典进行排序操作。

1.按键排序

方法1:使用sorted()函数

my_dict = {'banana': 3, 'apple': 2, 'pear': 1, 'orange': 4}# 按键排序(字母顺序)
sorted_dict = {k: my_dict[k] for k in sorted(my_dict)}
print(sorted_dict)  # 输出: {'apple': 2, 'banana': 3, 'orange': 4, 'pear': 1}

方法2:使用operator模块

import operator# 按键排序
sorted_items = sorted(my_dict.items(), key=operator.itemgetter(0))
sorted_dict = dict(sorted_items)
print(sorted_dict)

2.按值排序

方法1:使用lambda表达式

# 按值升序排序
sorted_dict = {k: v for k, v in sorted(my_dict.items(), key=lambda item: item[1])}
print(sorted_dict)  # 输出: {'pear': 1, 'apple': 2, 'banana': 3, 'orange': 4}# 按值降序排序
sorted_dict = {k: v for k, v in sorted(my_dict.items(), key=lambda item: item[1], reverse=True)}
print(sorted_dict)  # 输出: {'orange': 4, 'banana': 3, 'apple': 2, 'pear': 1}

方法2:使用operator模块

import operator# 按值排序
sorted_items = sorted(my_dict.items(), key=operator.itemgetter(1))
sorted_dict = dict(sorted_items)
print(sorted_dict)

3.复杂排序

多条件排序

people = {'Alice': {'age': 25, 'score': 90},'Bob': {'age': 30, 'score': 85},'Charlie': {'age': 25, 'score': 95}
}# 先按年龄升序,再按分数降序
sorted_people = dict(sorted(people.items(), key=lambda x: (x[1]['age'], -x[1]['score'])))
print(sorted_people)

(三)字典的合并

1. 使用 update() 方法(原地修改)

dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}dict1.update(dict2)
print(dict1)  # 输出: {'a': 1, 'b': 3, 'c': 4}

特点

  • 修改原字典(dict1)

  • 重复键的值会被dict2中的值覆盖

2. 字典解包

dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}merged_dict = {**dict1, **dict2}
print(merged_dict)  # 输出: {'a': 1, 'b': 3, 'c': 4}

特点

  • 创建新字典,不修改原字典

  • 可以合并多个字典:{**dict1, **dict2, **dict3}

  • 后面的字典会覆盖前面字典的相同键

3. 使用 | 合并运算符

dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}merged_dict = dict1 | dict2
print(merged_dict)  # 输出: {'a': 1, 'b': 3, 'c': 4}

特点

  • 语法简洁

  • 创建新字典,不修改原字典

  • 也支持原地合并:dict1 |= dict2

四.集合

        集合(Set)是Python中一种重要的内置数据类型,它提供了一种存储无序、不重复元素的高效方式。

(一)集合的基本特性

  • 无序性:集合中的元素没有固定顺序

  • 唯一性:集合自动去除重复元素

  • 可变性:集合是可变的,可以增删元素

  • 可哈希性:集合元素必须是不可变类型(数字、字符串、元组等)

(二)创建集合

方法1:使用花括号

fruits = {'apple', 'banana', 'orange'}

方法2:使用set()构造函数

numbers = set([1, 2, 3, 4, 5])  # 从列表创建
chars = set("hello")            # 从字符串创建 → {'h', 'e', 'l', 'o'}

方法3:空集合的创建

empty_set = set()  # 正确方式
not_empty = {}     # 这是创建空字典,不是集合!

(三)集合的基本操作

添加元素

fruits.add('mango')       # 添加单个元素
fruits.update(['kiwi', 'pear'])  # 添加多个元素

删除元素

fruits.remove('banana')   # 存在则删除,不存在则报错
fruits.discard('banana')  # 存在则删除,不存在也不报错
popped = fruits.pop()     # 随机删除并返回一个元素
fruits.clear()            # 清空集合

成员检测

'apple' in fruits   # True
'pear' not in fruits  # True

(四)集合运算

并集 (Union)

a = {1, 2, 3}
b = {3, 4, 5}
print(a | b)          # {1, 2, 3, 4, 5}
print(a.union(b))     # 同上

交集 (Intersection)

print(a & b)          # {3}
print(a.intersection(b))  # 同上

差集 (Difference)

print(a - b)          # {1, 2}
print(a.difference(b))  # 同上

对称差集 (Symmetric Difference)

print(a ^ b)          # {1, 2, 4, 5}
print(a.symmetric_difference(b))  # 同上

http://www.dtcms.com/a/320257.html

相关文章:

  • 「日拱一码」046 分支定界算法
  • Airflow 入门案例教程
  • 前端性能优化:从请求到资源的精细调控
  • 【第9话:感知算法基础1】深度学习神经网络模型基础知识概念入门简介
  • 批量获取亚马逊商品SKU商品规格调用流程
  • 【实时Linux实战系列】基于实时Linux的高频交易系统构建
  • Python 常用内置高阶函数
  • RabbitMQ面试精讲 Day 15:RabbitMQ故障转移与数据恢复
  • C++ min循环超超超详细指南
  • WFP DNS 域名解析
  • 深入理解C++模板进阶:非类型参数、特化与分离编译
  • Linux节点创建API与路径对应关系
  • AI日报0807 | GPT-5或今晚1点来袭:四大版本全曝光
  • 什么是 TDengine IDMP?
  • Disruptor 消费者核心:BatchEventProcessor解析
  • 告别复杂配置!cpolar让Prometheus监控突破网络限制
  • 【42】【OpenCV C++】 计算图像某一列像素方差 或 某一行像素的方差;
  • 嵌入式开发硬件——单片机
  • 【列出指定时间段内所有的下单产品】
  • 数据结构(循环顺序队列)
  • RAGAS:检索增强生成系统的无参考评估框架与技术解析
  • 2025年华数杯C题超详细解题思路
  • 哈希表原理与实现全解析
  • 天道20金句
  • Moses工具的配置和小语种平行语料训练SMT完整实现
  • 大模型 Transformer模型(上)
  • Java集合的遍历方式(全解析)
  • 力扣经典算法篇-46-阶乘后的零(正向步长遍历,逆向步长遍历)
  • BGP笔记整理
  • Maven高级:继承与聚合实战指南