1、集合特点
- 1.1、集合(set)是一个无序的不重复元素序列。
- 1.2、集合时无序的存储结构,元素没有先后关系。
- 1.3、元素必须是不可变对象
- 1.4、相当于只有键,没有值的字典
- 1.5、主要用于去重(一个列表变集合就去重了),和关系测试(关系测试:判断数据是否存在 交集,并集,差集 等关系)
2、集合的创建
- 2.1 非空集合 --使用大括号 { } 或者 set(Iterator) 函数
#1、使用{}创建
fruit = {"apple","banana","orange"}
#2、使用set(可迭代对象)
language = set("python")
#运行结果:{'o', 'p', 'y', 'h', 'n', 't'}
list1 = ["java","python","php"]
set1 = set(list1)
print(set1)
#运行结果:{'php', 'python', 'java'}
- 2.2 创建一个空集合必须用 set() 备注:不能是 { },因为 { } 是用来创建一个空字典。
#创建空集合
set1 = set()
#运行结果:set()
- 2.3 集合推导式来创建集合
- 语法:{表达式 for 变量 in 可迭代对象 [if 真值表达式]}
#利用集合推导式创建
set1 = {x**2 for x in range(10)}
print(set1)
#运行结果:{0, 1, 64, 4, 36, 9, 16, 49, 81, 25}
3、集合的运算
- 交集:& 并集:| 补集: - 对称补集: ^ 子集:< 超集:> 相同:== 不同:!=
#集合的运算
s = {1,2,3,4,5}
s1 = {1,2,3}
s2 = {3,4,5,6,7}
#交集 & 两个集合共同部分。
s3 = s & s2
#运行结果:{3, 4, 5}
#并集 | 连个集合所有。
s3 = s | s2
#运行结果:{1, 2, 3, 4, 5, 6, 7}
#补集 - 存在于集合1中,但不属于集合2.
s3 = s - s2
#运行结果:{1, 2}
#对称补集 ^ 出去共有部分,省下的。
s3 = s ^ s2
#运行结果:{1, 2, 6, 7}
#子集 <
s3 = s < s1 #判断s是s1的子集吗?
#运行结果:False
#超集 >
s3 = s > s1 #判断s是s1的超集吗?
#运行结果:True
#集合相同 ==
s3 = s1 == s2 #判断s1和s2相同吗?
#运行结果:False
#集合不同 !=
s3 = s != s1 #判断集合不等吗?
#运行结果:True
4、集合的方法
- 添加 s.add(x) 将元素 x 添加到集合 s 中,如果元素已存在,则不进行任何操作。
- s.update() 参数可以是列表,元组,字典, x 可以有多个,用逗号分开。
#集合的添加
set1 = {"java","c++","PHP"}
#add方法
set1.add("python")
#update方法
set1.update("c") #单个
set1.update([1,2],["Html"]) #多个,列表
print(set1)
- 删除 s.remove(x) 将元素 x 从集合 s 中移除,如果元素不存在,则会发生错误。
- s.discard(x) 如果元素不存在,不会发生错误。
- s.pop() 随机的删除一个元素,并返回被删除值。
- s.clear() 移除集合所有值。
#1、集合的删除remove()
set1 = {"java","python","php"}
set1.remove("java")
运行结果:{'python', 'php'}
set1.remove("c++")
运行结果:当不存在时
Traceback (most recent call last):
File "C:\Users\Administrator\Documents\Aptana Studio 3 Workspace\test\day_5_31.py", line 3, in <module>
set1.remove("c++")
KeyError: 'c++'
#2、删除discard
set1 = {"java","python","php"}
set1.discard("java")
set1.discard("c++")
print(set1)
运行结果:{'python', 'php'}
#3、随机删除,返回值。
set1 = {"java","python","php"}
s = set1.pop()
print(s)
运行结果:php(随机的)
- 集合运算 交集 set.intersection(set1, set2 ... etc) 用于返回两个或更多集合中都包含的元素,即交集。返回新的集合
- set.intersection_update(set1, set2 ... etc) 在原始的集合上移除不重叠的元素
- 并集 set.union(set1, set2...) 方法返回两个集合的并集
- 补集(又叫差集)set.difference(set) 返回的集合元素包含在第一个集合中,但不包含在第二个集合(方法的参数)中。
- set.difference_update(set) 同上 ,直接在原来的集合中移除元素,没有返回值。
- 对称补集 set.symmetric_difference(set) 返回两个集合中不重复的元素集合。
- set.symmetric_difference_update(set) 同上,没有返回值。
- 子集 set.issubset(set) 判断指定集合是否为该方法参数集合的子集。 返回True,False
- 超集 set.issuperset(set) 判断该方法的参数集合是否为指定集合的子集。返回True,False
#intersection方法,返回一个新的集合。
x = {"apple", "banana", "cherry"}
y = {"google", "runoob", "apple"}
z = x.intersection(y)
print(z)
运行结果:{'apple'}
#intersection,在原有的集合上更新。
x = {"apple", "banana", "cherry"}
y = {"google", "runoob", "apple"}
x.intersection_update(y)
print(x)
运行结果:{'apple'}
#并集 union()
x = {"apple", "banana", "cherry"}
y = {"google", "runoob", "apple"}
z = x.union(y)
print(z)
运行结果:{'cherry', 'runoob', 'google', 'banana', 'apple'}
#补集(差集) difference
x = {"apple", "banana", "cherry"}
y = {"google", "microsoft", "apple"}
z = x.difference(y)
print(z)
运行结果:{'cherry', 'banana'}
#补集 difference_update()
x = {"apple", "banana", "cherry"}
y = {"google", "microsoft", "apple"}
x.difference_update(y)
print(x)
运行结果:{'cherry', 'banana'}
#对称补集 symmetric_difference
x = {"apple", "banana", "cherry"}
y = {"google", "runoob", "apple"}
z = x.symmetric_difference(y)
print(z)
运行结果:{'google', 'cherry', 'banana', 'runoob'}
#对称补集 symmetric_difference_update 无返回值
x = {"apple", "banana", "cherry"}
y = {"google", "runoob", "apple"}
x.symmetric_difference_update(y)
print(x)
运行结果:{'google', 'cherry', 'banana', 'runoob'}
#子集 issuperset()
x = {"a", "b", "c"}
y = {"f", "e", "d", "c", "b", "a"}
z = x.issubset(y)
print(z)
运行结果:True
#超集 issuperset()
x = {"f", "e", "d", "c", "b", "a"}
y = {"a", "b", "c"}
z = x.issuperset(y)
print(z)
运行结果:True
- 其他 set.isdisjoint(set) 判断两个集合是否包含相同的元素,如果没有返回 True,否则返回 False。
- set.copy(set) 用于拷贝一个集合
- 内建函数 len(set) max(set) min(set) sum(set) any(set) all(set)
- x in(not in) set 判断元素 x 是否在集合 set 中,存在返回 True,不存在返回 False。
#判断有没有相同元素 isdisjoint() x = {"apple", "banana", "cherry"} y = {"google", "runoob", "facebook"} z = x.isdisjoint(y) print(z) #运行结果:True #复制 copy() fruits = {"apple", "banana", "cherry"} x = fruits.copy() print(x) #运行结果:{"apple", "banana", "cherry"} #长度计算 len(set) fruits = {"apple", "banana", "cherry"} len(fruits) #运行结果:3 #判断元素是否存在 x in set fruits = {"apple", "banana", "cherry"} s = "apple" in fruits print(s) #运行结果:True
5、固定集合(frozenset)
- 固定集合和集合的区别就是固定集合是不可变的,而集合是可变的,其他的基本都一样
- 相当于集合的全部方法去掉能够修改集合的方法
f = frozenset([1,2,3,4])