集合为Python基本数据之一,它是无序的(排列顺序无序)、无索引的(不能通过下标索引)、不重复的(元素不重复);集合里面的元素必须是可hash的(int,str,tuple,bool)。可以与字典一起记忆,set就是dict类型的数据但是不保存value,只保存key,set也用{}表示。
集合不支持的功能:作为一种无序的多项集,集合并不记录元素位置或插入顺序。 相应地,集合不支持索引、切片或其他序列类的操作。
集合支持的功能:包括成员检测、从序列中去除重复项以及数学中的集合类计算,例如交集、并集、差集与对称差集等等。
提示:以下是本篇文章正文内容,下面案例可供参考
st = set()
print(type(st)) #
dt = {}
print(type(dt)) #
basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
print(basket) # {'banana', 'orange', 'apple', 'pear'}
sets = {c for c in 'abracadabra'}
print(sets)
set1 = set('abcdecc') # {'b', 'd', 'e', 'a', 'c'}
set2 = set([1,2,3,4,5]) # {1, 2, 3, 4, 5}
set3 = set(('a','b','c')) # {'c', 'a', 'b'}
set4 = set({'a':1,'b':2}) # {'a', 'b'} value值舍弃
ls = [1,2,3,4,5,6]
new_list = []
for i in ls:
if i not in new_list: # 可以元素判断重复否
new_list.append(i)
print(new_list) # [1, 2, 3, 4, 5, 6]
num_set = {1,2,3,4}
num_set.add(6)
print(num_set) # {1, 2, 3, 4, 6}
s = {1,2,3,4,5}
s.update([7,8])
print(s) # {1, 2, 3, 4, 5, 7, 8}
s.remove(x) 删除元素,不存在会报错
s.discard(x) 删除元素,不存在不会报错
n = s.pop() 随机删除一个元素,并返回删除的元素值
s.clear() 清空集合的所有元素
del s 删除整个集合,注意集合是不能索引下标的
要删除的元素不存在时,会报错。
s = {1,2,3,4,5,6,7}
s.remove(7)
print(s) # {1, 2, 3, 4, 5, 6}
删除指定的元素,找不到元素,返回原集合
s = {1,2,3,4,5,6,7}
s.discard(4)
print(s) # {1, 2, 3, 5, 6, 7}
s.discard(11)
print(s) # {1, 2, 3, 5, 6, 7}
随机删除一个元素,并返回删除的元素。集合为无序的,即顺序无序,时刻都可能在变化,故pop()方法删除的元素是随机的。
s = {1,2,3,4,5,6,7}
pop_num = s.pop()
print(pop_num) # 1
s = {1,2,3,4,5,6,7}
s.clear()
print(s) # set()
s = {1,2,3,4,5,6,7}
del s
# print(s) 报错,集合已经删除
# del s[0] 报错,集合不支持索引
集合是不可索引的,因此没有办法通过索引修改集合的元素,也没有对应的函数(方法)修改集合元素的值,可以先删除再添加,达到改变的集合的数据,实现修改集合。
s = {1,2,3,4,5,6,7}
s.remove(3) # 先删除元素
s.add(33) # 再添加元素
print(s) # {1, 2, 33, 4, 5, 6, 7}
注意:集合是无序的,不支持索引查找对应的值(元素),只能判断指定元素存在集合中的True或False(详细见下面的in、not in成员判断),以for循环遍历集合中的所有元素。
for i in {1,2,3,4,5}:
print(i)
s = {1,2,8,3,4,5,3,5,4,5,7}
print(s) # {1, 2, 3, 4, 5, 7, 8}
print(list(s)) # [1, 2, 3, 4, 5, 7, 8]
(1)不必按照原序列的顺序排序
l = ['a','a','c','b','e','d','d','f']
nl = list(set(l))
print(nl) # ['f', 'c', 'd', 'b', 'a', 'e'],顺序跟set()有关,会时刻变化
(2)按照原序列的顺序排序
开发思路:直接使用set()构造器去重,再转换回列表,最后对新列表进行排序sort(key=list.index)
l = ['a','a','c','b','e','d','d','f']
nl = list(set(l))
nl.sort(key=l.index) # 按照原列表顺序排列
print(nl) # ['a', 'c', 'b', 'e', 'd', 'f']
开发思路:for遍历原列表,如果新列表没有,就取一个元素就放一个元素到新列表中,这样顺序按照原列表的顺序排列。
l = [1,2,3,3,4,5,3,5,4,5,7]
nl = []
for item in l:
if item not in nl:
nl.append(item)
print(nl) # [1, 2, 3, 4, 5, 7]
import itertools
l = [1,4,3,3,4,2,3,4,5,6,1]
l.sort()
sl = itertools.groupby(l)
print(sl) #
for k,obj in sl:
print(k)
"""输出
a
b
c
d
e
f
"""
s = {1,2,3,4,5}
print(len(s))
s = {1,2,3,4,5}
s1 = s.copy() # 该方法,如果删除原集合,不会导致副本集合的改变
print(s1)
s = {11,1.1,'helle',(1,2,3)}
print(s)
s1 = {1,2,3}
s2 = {'a','b','c'}
s3 = {(1,2,3),('a','b')}
# s4 = {[1,2,3],4,5} 报错,元素数据类型不能是列表
# s5 = {{1,2,3},4,5} 报错,元数数据类型不能是集合
# s6 = {{1:'a','b':True},333,222,111} 报错,元数数据类型不能是字典
set1 = {-2,-1,0,1,2,3}
set2 = {-2,1,2,3,4,5}
# 并集:所有元素(|、union)
print(set1.union(set2)) # {0, 1, 2, 3, 4, 5, -1, -2}
# print(set2.union(set1)) # {0, 1, 2, 3, 4, 5, -1, -2}
print(set1 | set2) # {0, 1, 2, 3, 4, 5, -1, -2}
# print(set2 | set1) # {0, 1, 2, 3, 4, 5, -1, -2}
set1 = {-2,-1,0,1,2,3}
set2 = {-2,1,2,3,4,5}
# 交集:公共元素(&、intersection)
print(set1.intersection(set2)) # {1, 2, 3, -2}
# print(set1.intersection(set3)) # {1, 2, 3, -2}
print(set2 & set1) # {1, 2, 3, -2}
# print(set1 & set2) # {1, 2, 3, -2}
set1 = {1,2,3,4}
set2 = {3,4,5,6}
# 交集并更新到set2
# set2.intersection_update(set1)
# print(set2) # {3, 4}
# 交集并更新到set1
# set1.intersection_update(set2)
# print(set1) # {3, 4}
set1 = {-2,-1,0,1,2,3}
set2 = {-2,1,2,3,4,5}
# 差集:独有元素(-、difference)
# 差集:set2独有的成员
print(set2.difference(set1)) # {4, 5}
print(set2 - set1) # {4, 5}
# 差集:set1独有的成员
print(set1.difference(set2)) # {0, -1}
print(set1 - set2) # {0, -1}
set1 = {1,2,3,4}
set2 = {3,4,5,6}
# 差集并更新到set1
# set1.difference_update(set2)
# print(set1) # {1, 2}
# 差集并更新到set2
# set2.difference_update(set1)
# print(set2) # {5, 6}
俩集合各自独有元素之和,即不包含共有的其它元素之和。
也可以理解,先差集,再取反。即:各自独有的成员集合((s1-s2)+(s2-s1))。
set1 = {1, 2, 3, 4}
set2 = {3, 4, 5, 6}
# 反差集(对称差集):^、symmetric_difference()
print(set1.symmetric_difference(set2)) # {1, 2, 5, 6}
# print(set2.symmetric_difference(set1)) # {1, 2, 5, 6}
print(set1 ^ set2) # {1, 2, 5, 6}
# print(set2 ^ set1) # {1, 2, 5, 6}
先差集,再取反,最后将结果更新到集合中
set1 = {1, 2, 3, 4}
set2 = {3, 4, 5, 6}
# 反差集(对称差集)并更新到集合中
# set1.symmetric_difference_update(set2)
# print(set1) # {1, 2, 5, 6}
# set2.symmetric_difference_update(set1)
# print(set2) # {1, 2, 5, 6}
sets = {1, 2, 3, 4, 5}
print(5 in sets) # True
print(9 in sets) # False
print(3 not in sets) # False
print(0 not in sets) # True
set1 = {1,2,3,4,5,6,7}
set2 = {2,3}
print(set1.issubset(set2)) # False
print(set2.issubset(set1)) # True
set1 = {1,2,3,4,5,6,7}
set2 = {2,3}
print(set1.issuperset(set2)) # True,表示set1是set2的超集
print(set2.issuperset(set1)) # False,表示set2不是set1的超集
s1 = {1, 2, 3}
s2 = {1, 2, 3, 4, 5}
# 子集
print(s1 < s2) # s1是s2的子集 # True
print(s1.issubset(s2)) # True
# 超集
print(s1 > s2) # s1不是s2的超集 # False
print(s2.issuperset(s1)) # s2是s1的超集 # True
s1 = {1, 2, 3, 4, 5}
s2 = {1, 2, 3}
print(s1 < s2) # False,检测集合s1是否为s2的真子集,s1 <= s2 and s1 != s2
print(s1 <= s2) # False,检测是否集合s1中的每个元素都在s2中
print(s1 > s2) # True s1是s2的超集
print(s1 >= s2) # True
set集合本身是可以发生改变的,是不可hash的。我们可以使用frozenset来保存数据,frozenset是不可变,也就是一个可hash的数据类型。
s = frozenset(['a','b','c','d'])
print(s) # frozenset({'c', 'a', 'd', 'b'})
dict1 = {s:"123"}
print(dict1) # {frozenset({'c', 'b', 'a', 'd'}): '123'}