python 集合与字典
集合的定义
集合是项目的无序集合。每个元素都是唯一的(没有重复项),并且必须是不可变的(不能更改)。
但是,集合本身是可变的。我们可以在其中添加或删除项目。
集合可用于执行数学集合运算,例如并集,交集,对称差等。
如何创建集合?
通过将所有项目(元素)放在大括号 {}
中并用逗号分隔或使用内置函数来创建集合 set()
。
它可以具有任意数量的项目,并且它们可以具有不同的类型(整数,浮点数,元组,字符串等)。但是集合不能具有可变元素(例如 list ,set 或 dictionary)作为其元素。
dic1 = {1, 2, 3} dic2 = {1.0, (1, 2, 3), 'Hello'} print(dic1) print(dic2)
# 无重复集合 my_set = {1,2,3,4,3,2} print(my_set) # 我们可以从列表中生成集合 my_set = set([1,2,3,2]) print(my_set)
创建一个空集有点特殊。
空括号 {}
将在Python中创建一个空字典。为了建立一个没有任何元素的集合,我们使用没有任何参数的 set()
函数。
# 用{}初始化 a = {} # 检查a的数据类型 print(type(a)) #<class 'dict'> # 初始化使用 set() a = set() # 检查a的数据类型 print(type(a)) #<class 'set'>
集合是可变的。但由于它们是无序的,因此索引没有意义。
我们无法使用索引或切片来访问或更改集合的元素,这是集合不支持的操作。
我们可以使用 add()
方法添加单个元素,使用 update()
方法添加多个元素。update()
方法可以采用元组,列表,字符串或其他集合作为其参数。在所有情况下,都避免重复。
# 初始化 my_set my_set = {1,3} print(my_set) # 增加一个元素 my_set.add(2) print(my_set) # 增加多个元素 my_set.update([2,3,4]) print(my_set) # 增加 list 和set my_set.update([4,5], {1,6,8}) print(my_set)
如何从集合中删除元素?
可以使用 discard()
和 remove()
方法从集合中删除特定项目。
两者之间的唯一区别是,如果使用 discard()
,而项目不存在于集合中,则它保持不变。但是 remove()
在这种情况下会引发错误。
# 初始化 my_set my_set = {1, 3, 4, 5, 6} print(my_set) # 抛弃一个元素 my_set.discard(4) print(my_set) # 移除一个元素 my_set.remove(6) print(my_set) # 抛弃一个元素 my_set.discard(2) print(my_set)
同样,我们可以使用 pop()
方法删除并返回一个项目。
集合为无序,无法确定将弹出哪个项目。这是完全任意的。
我们还可以使用 clear()
方法删除集合中的所有项目。
# 初始化 my_set my_set = set("HelloWorld") print(my_set) # pop一个元素 # 输出: 随机元素 print(my_set.pop()) # pop 任意元素 my_set.pop() print(my_set) # 清空 my_set my_set.clear() print(my_set)
Python 集合操作
集合可用于执行数学集合运算,例如并集,交集,差和对称差。我们可以通过运算符或方法来实现。
让我们考虑以下两组用于以下操作。
集合并集
A 和 B 的并集是来自这两个集合的所有元素的集合。
并集是使用 |
操作符执行的。也可以使用 union()
方法来完成。
# 初始化 A 和 B A = {1, 2, 3, 4, 5} B = {4, 5, 6, 7, 8} C = A.union(B) # 使用 | 运算符 print(A | B) print(C)
集合相交
A 和 B 的交集是在这两个集合中共有的一组元素。
交点使用 &
运算符执行。使用 intersection()
方法可以完成相同的操作
# 初始化 A 和 B A = {1, 2, 3, 4, 5} B = {4, 5, 6, 7, 8} print(A.intersection(B))#{4, 5} print(B.intersection(A))#{4, 5} # 使用 & 运算符 print(A & B)#{4, 5}
集合差异
A 和 B 的差 A - B 是仅在 A 中但不在 B 中的一组元素。类似地,B - A 是 B 中但不在 A 中的一组元素。
差异是使用 -
运算符执行的。使用 difference()
方法可以完成相同的操作。
# 初始化 A 和 B A = {1, 2, 3, 4, 5} B = {4, 5, 6, 7, 8} # 在A上使用 - 运算符 print(A - B) print(A.difference(B))
集合对称差异
A 和 B 的对称差异是 A 和 B 中的一组元素,但两者中的元素相同。
对称差使用 ^
运算符执行。使用 symmetric_difference()
方法可以完成相同的操作。
# 初始化 A 和 B A = {1, 2, 3, 4, 5} B = {4, 5, 6, 7, 8} # 使用 ^ 运算符 # 输出: {1, 2, 3, 6, 7, 8} print(A ^ B) print(A.symmetric_difference(B))
集合与内置函数
内置函数如 all()
、any()
、enumerate()
、len()
、max()
、min()
、sort()
、sum()
等常用来与 set 一起执行不同的任务。
Python Frozenset
# 初始化 A 和 B A = frozenset([1, 2, 3, 4]) B = frozenset([3, 4, 5, 6]) print(A.isdisjoint(B)) print(A.difference(B)) print(A | B)
Frozenset 是具有集合特征的新类,但是一旦分配,就不能更改其元素。元组是不可变列表,而冻结集是不可变集。
可变的集合不可散列,因此不能用作字典键。另一方面,frozenset 是可哈希化的,可用作字典的键。
可以使用函数 Frozenset()
创建 Frozensets 。
此数据类型支持的方法,如 copy()
,difference()
,intersection()
,isdisjoint()
,issubset()
,issuperset()
,symmetric_difference()
和 union()
。由于不可变,因此没有添加或删除元素的方法。
字典的定义
Python 的字典数据类型是基于 hash 散列算法实现的,采用键值对 (key: value) 的形式,根据 key 的值计算 value 的地址,具有非常快的查取和插入速度。
字典包含的元素个数不限,值的类型可以是任何数据类型!但是字典的 key 必须是不可变的对象,例如整数、字符串、bytes 和元组等,最常见的还是将字符串作为 key。列表、字典、集合等就不可以作为 key。同时,同一个字典内的 key 必须是唯一的,但 value 则不必。
注意:从 Python3.6 开始,字典是有序的!它将保持元素插入时的先后顺序!请务必清楚!
字典可精确描述为不定长、可变、散列的集合类型。字典元素在内存中的存储方式是不连续的,也没有链接关系,所以千万不要用列表的序列性质来套字典的性质。
字典的每个键值对用冒号 :
分割,每个对之间用逗号 ,
分割,整个字典包括在花括号 {}
中 ,例如:
d = {key1: value1, key2: value2 }
dic = {} # 创建空字典 print(dic) dic = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'} print(dic) print(dict([('sape', 4139), ('guido', 4127), ('jack', 4098)])) print(dict(sape=4139, guido=4127, jack=4098)) # {} # {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'} # {'sape': 4139, 'jack': 4098, 'guido': 4127} # {'sape': 4139, 'jack': 4098, 'guido': 4127}
字典操作
访问字典
虽然现在的字典在访问时有序了,但字典依然是集合类型,不是序列类型,因此没有索引下标的概念,更没有切片的说法。
但与 list 类似的地方是,字典采用把相应的键放入方括号内获取对应值的方式取值。
dic = {'Name': 'Jack','Age': 7, 'Class': 'First'} print("dic['Name']: ", dic['Name']) print("dic['Age']: ", dic['Age'])
增加和修改
增加就是往字典插入新的键值对,修改就是给原有的键赋予新的值。
由于一个 key 只能对应一个值,所以,多次对一个 key 赋值,后面的值会把前面的值更新掉。
dic = {'Name': 'Jack','Age': 7, 'Class': 'First'} dic["address"] = "Shanghai" dic["address"] = "Beijing" dic["Age"] = 18 print(dic) #{'Name': 'Jack', 'Age': 18, 'Class': 'First', 'address': 'Beijing'}
要统计字典内键的个数,可以使用 Python 内置的 len()
函数:
dic = {'Name': 'Jack', 'Age': 18, 'Class': 'First', 'address': 'Beijing'} print(dic) print(len(dic)) # {'Name': 'Jack', 'Age': 18, 'Class': 'First', 'address': 'Beijing'} # 4
删除字典元素、清空字典和删除字典
使用 del 关键字删除字典元素或者字典本身,使用字典的 clear() 方法清空字典。
dic = {'Name': 'Jack', 'Age': '20', 'Class': 'First', 'sex': 'male'} print(dic) del dic['Name'] # 删除指定的键 print(dic) a = dic.pop('Class') # 弹出并返回指定的键。必须提供参数! print(a) print(dic) dic.clear() # 清空字典 print(dic) del dic # 删除字典本身 print(dic)
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性