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)
复制代码

 

 

 

posted @   君逸堂  阅读(666)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示