目录
1.集合的定义
- python语言提供的内置数据结构
- 与列表、字典一样都属于可变类型的序列
- 集合是没有value的字典(花括号定义,底层数据结构也采用了hash表)
2.集合的创建
- 用{}创建
s={'Python','hello',90}
- 用内置函数set()创建
s=set(range(6))
print(s) #{0, 1, 2, 3, 4, 5}
#集合元素不能重复
print(set([3,4,5,5,7,7])) #列表转成集合,同时去掉了重复元素,集合中元素无序,通过hash存储,{3, 4, 5, 7}
print(set((3,4,5,8))) #元组转成集合,同时去掉了重复元素,集合中元素无序,通过hash存储,{8, 3, 4, 5}
print(set('Python')) #字符串转成集合,同时去掉了重复元素,集合中元素无序,通过hash存储,{'P', 't', 'h', 'y', 'n', 'o'}
print(set({1,2,3,9,5})) #集合转成集合,同时去掉了重复元素,集合中元素无序,通过hash存储,{1, 2, 3, 5, 9}
print(set()) #定义空集合,set()
#不可以直接使用花括号定义空集合
s={} #这是字典类型
3.集合元素的判断操作
- in 或 not in
s={10,20,30,100}
print(10 in s) #True
print(90 in s) #False
print(80 not in s) #True
print(20 not in s) #False
4.集合元素的新增
- 调用add()方法,一次添加一个元素
- 调用update()方法,至少添加一个元素
s={10,20}
s.add(100)
print(s) #{100, 10, 20}
s.update({200,400})
print(s) #{400, 100, 20, 200, 10}
s.update([70,60])
s.update((50,))
print(s) #{400, 50, 100, 20, 70, 200, 10, 60}
5.集合元素的删除
- 调用remove()方法,一次删除一个指定元素,如果指定元素不存在抛出KeyError
- 调用discard()方法,一次删除一个指定元素,如果指定元素不存在不抛出异常
- 调用pop()方法,一次只删除一个任意元素
- 调用clear()方法,清空集合
s={10,40,20,80,30}
s.remove(80)
print(s)
#s.remove(100) #抛出异常KeyError
s.discard(100) #100不存在,但是不会抛出异常
s.pop() #删除任意元素,不能指定参数
s.clear() #set(),清空集合
6.集合之间的关系
- 两个集合是否相等
#使用==或者!=进行判断
s1={10,20,30,40}
s2={40,30,10,20}
print(s1==s2) #True
print(s1!=s2) #False
- 一个集合是否是另一个集合的子集
s1={10,20,30,40,50,60}
s2={10,20,30,40}
s3={10,20,90}
print(s2.issubset(s1)) #True
print(s3.issubset(s1)) #False
- 一个集合是否是另一个集合的超集
s1={10,20,30,40,50,60}
s2={10,20,30,40}
s3={10,20,90}
print(s1.issuperset(s2)) #True
print(s1.issuperset(s3)) #False
- 两个集合是否不相交
s1={10,20,30,40,50,60}
s2={10,20,30,40}
s3={80,90}
print(s1.isdisjoint(s2)) #False
print(s1.isdisjoint(s3)) #True
7.集合的数学操作
- 交集
s1={10,20,30,40}
s2={20,30,40,50,60}
#intersection()方法与&等价,求交集
print(s1.intersection(s2)) #{40, 20, 30}
print(s1 & s2) #{40,20,30}
- 并集
s1={10,20,30,40}
s2={20,30,40,50,60}
#union()方法与|等价,求并集
print(s1.union(s2)) #{40, 10, 50, 20, 60, 30}
print(s1 | s2) #{40, 10, 50, 20, 60, 30}
- 差集
s1={10,20,30,40}
s2={20,30,40,50,60}
#difference()方法与-等价,求差集
print(s1.difference(s2)) #{10}
print(s1 - s2) #{10}
- 对称差集
s1={10,20,30,40}
s2={20,30,40,50,60}
#symmetric_difference()方法与^等价,求对称差集
print(s1.symmetric_difference(s2)) #{50, 10, 60}
print(s1 ^ s2) #{50, 10, 60},s1中的10和s2中的50,60
8.集合生成式
s={i*i for i in range(6)}
print(s) #{0, 1, 4, 9, 16, 25}
9.列表、字典、元组、集合总结
数据结构 | 是否可变 | 是否重复 | 是否有序 | 定义符号 |
列表(list) | 可变 | 可重复 | 有序 | [] |
元组(tuple) | 不可变 | 可重复 | 有序 | () |
字典(dict) | 可变 | key不可重复 | 无序 | {key:value} |
value可重复 | ||||
集合(set) | 可变 | 不可重复 | 无序 | {} |
10.字符串的概念
- 在python中字符串是基本数据类型,是一个不可变的字符序列
- 字符串的驻留机制:仅保留一份相同且不可变字符串的方法,不同的值被存放在字符串的驻留池中,python的驻留机制对相同字符串只保留一份拷贝,后续创建相同字符串时,不会开辟新空间,而是把该字符串的地址赋给新的变量
11.字符串的定义
a='Python'
b="Python"
c='''Python'''
print(a,b,c) #Python Python Python
print(id(a),id(b),id(c)) #2838701557664 2838701557664 2838701557664,可以看到id相同
a+=b
print(a,b) #Pythonb Python
print(id(a),id(b),id(c)) #2838703054896 2838701557664 2838701557664,可以看到a的id改变了
备注:在需要进行字符串拼接时建议使用str类型的joint()方法,而非+,因为join()方法是先计算出所有字符串的长度,然后再拷贝,只new一次对象,效率要比“+”高