- 集合是指无序且不重复的数据/元素集。
- 集合具有无序性(unordered),s={1,2,3}仅表示1、2、3在集合s中,三者没有先后顺序。
- 集合元素唯一性(unique),任意一个集合中不存在两个相同的元素。
- 集合元素不可更改(immutable)。
一、创建集合
前提知识:
harshable:
An object is hashable if it has a hash value which never changes during its lifetime (it needs a __hash__() method), and can be compared to other objects (it needs an __ eq__() or __cmp__()). Hashable objects which compare equal must have the same hash value.
对于 Python 的标准数据类型来说:
- 创建之后无法修改(immutable)=可哈希( hashable),例如:字符串(string)、元祖(tuple)
- 创建之后可修改(mutable)=不可哈希(unharshable),例如:列表(list)、字典(dict)、集合(set),因为它们在改变值的同时却没有改变id,无法由地址定位值的唯一性,因而无法哈希。
创建方法:
- 方法一:使用函数set ( [iterable] )。 iterable对象可以为:列表(list)、字符串(string)等任意iterable数据类型,但要求对象是可哈希的(harshable),这里等价于不可更改的(immutable)。
- 方法二:使用{ }分配。
(1)创建空集合:使用python内置函数set()
s=set()
print(s) #输出:set()
(2)创建字符串集合:s=set("XXXX") 或者 s={"X","X","X",X"}
s=set("wahoo!")
print(s) #输出:{'w', 'h', 'o', 'a', '!'} ,每个元素的输出顺序是随机的。
(3)创建元祖集合:s=set((X,X)),也可以用s={(X,X)},但两者不等价
s1=set((1,2,3))
print(s1) #输出:{1,2,3}
s2={(1,2,3)}
print(s2) #输出:{(1,2,3)}
(4)创建列表集合:s=set( L ) 或者 s={L[0],L[1],...}
s1=set(["marvel","ohh","test"])
print(s1) #输出:{"ohh","test","marvel"}
s11={"marvel","ohh","test"}
print(s11) #输出:{"ohh","test","marvel"}
s2=set([0,12,111])
print(s2) #输出:{0,12,111}
s22={0,12,111}
print(s22) #输出:{0,12,111}
(5)创建集合的集合:s=set({X,X,X})
s1=set({1,2,3})
print(s1) #输出:{1,2,3}
a={1,2,3}
s2=set(a)
print(s2) #输出:{1,2,3}
☆☆☆总结来说,集合的对象必须是iterable类型,集合的元素必须是可哈希的,也就是不可更改的。
- 对象可以是任意iterable类型,如:list、string、dict、set等等;
- 元素只能是string、数字、tuple等不可更改类型,不能是list、dict、set等可更改类型。
下面是一些错误创建的例子:
#all the sentences here are wrong!!
s1=set([[1,2,3]])
print(s1) #typeError: unhashable type: 'list'
s2={[1,2,3]}
print(s2) #typeError: unhashable type: 'list'
a=set([1,2,3])
s3=set(a)
print(s3) #typeError: unhashable type: 'set'
s4={}
print(type(s4)==set) #False, s4 is a dict
二、集合操作
2.1 单个集合的操作
- len(s):返回集合s中元素个数
- s.copy():浅拷贝
- s.clear():清除集合s中的所有元素
s={1,2,3,1,3}
len(s) # 3
b=s.copy()
print(b) # {1,2,3}
s.add(4)
print("s=",s) # {1,2,3,4}
print("b=",b) # {1,2,3}
2.2 一个集合和一个元素的操作
- x in s:判断x是否在集合s中,在返回True,不在返回False
- x not in s:判断x是否不在集合s中,不在返回True,在返回False
- s.add(x):向集合s中添加元素x,如果x已经在s中,则不添加
- s.remove(x):从集合s中删除元素x,如果x不在s中,引发Keyerror,crash!
- s.discard(x):从集合s中删除元素x,如果x不在s中,不引发crash。
s=set([1,2,3,4])
x1=1
x2=7
print(x1 in s) #True
print(x2 in s) #False
print(x1 not in s) #False
s.add(x2)
print(s) #{1,2,3,4,7}
s.remove(1) #{2,3,4,7}
s.remove(9) #KeyError: 9
s.discard(9) #it's OK!
s.discard(2) #{3,4,7}
2.3 两个集合的操作
- s.issubset(t):检查集合s是集合t的子集,即:检查s中的所有元素是否在集合t中,s<=t为True,反之为False
- s.issuperset(t):检查集合t是否是集合s的子集,即:检查t中的所有元素是否在集合s中,t<=s为True,反之为False
- s.union(t):返回由集合s和集合t中所有元素组成的新集合,即:返回s|t
- s.intersection(t):返回由既在集合s中又在集合t中的元素组成的新集合,即:返回s&t
- s.difference(t):返回在集合s中但不在集合t中的元素组成的新集合,即:返回s-t
- s.update(t):无返回值,修改集合s,将在集合t中但不在集合s中的元素添加到集合s中,即:s|=t
s={1,2,3,4}
t={1,4,6,7}
s.issubset(t) # False
s.issuperset(t) # False
new1=s.union(t) # {1,2,3,4,6,7}
new2=s.intersection(t) # {1,4}
new3=s.difference(t) # {2,3}
s.update(t) # s={1,2,3,4,6,7}
注意无返回值的操作!!