集合是一个数学概念: 由一个或多个确定的元素所构成的整体叫做集合
集合的三个特性:
1. 确定性 (element 必须可 hash, 不可变类型是可 hash 的)
2. 互异性 (集合中 element 不能重复)
3. 无序性 (集合中没有先后之分, 例如集合:{3,4,6} 等于 {6,4,3})
#集合的存在意义在于去重和关系运算
集合的定义:
- st = set('hello')
- lis = list('hello')
- print(st)
- # {'h', 'o', 'l', 'e'}
- print(lis)
- # ['h', 'e', 'l', 'l', 'o']
- # [注意]
- dic={}# 空花括号 {}, 代表定义字典
- print('dic type:%s'%type(dic))
- >>:dic type:<class 'dict'>
- st = {'h', 'e', 'l', 'l', 'o'}# 定义的时候集合内出现了重复的项, 但是并没有报错, 只是剔除了重复 element
- print(st)
- # {'h', 'o', 'l', 'e'}
1) 集合是无序的, 不重复的数据类型;
2) 因此不支持索引, 也不支持切片; 也不支持重复; 也不支持连接;
3) 支持成员操作符;
4) 支持 for 循环;
- # print(type(set([i for i in range(0, 9)])))
- lis = [i for i in range(0, 9)]
- d = {}.fromkeys(lis)
- # print(type(d))
- # print(d)
- # print(d.keys())
- # for key in d.keys():
- # print(key)
- st = set([i for i in range(0, 3)])
- # print('st type:%s st:%s' % (type(st), st))
- # st type:<class 'set'> st:{0, 1, 2}
- # 增加 element
- st.add('new element')
- st2 = {9, 8, 7, }
- # 更新
- st.update(st2) # 可以看成集合的凭接吗
- st.update('t') # 单个元素, 或者是集合本身也可以进行拼接
- # st.add({'b', 'y'}) # 报错 TypeError: unhashable type: 'set'
- # print(st)
- # 查找 element
- s1 = set({i for i in range(1, 8)})
- s2 = set({i for i in range(6, 10)})
- # 交集
- # print(s1 & s2) # {6, 7}
- # print(s1.intersection(s2)) # {6, 7}
- # s1.intersection_update(s2)
- # print(s1) # {6, 7}
- # 并集
- # print(s1 | s2)# {1, 2, 3, 4, 5, 6, 7, 8, 9}
- # print(s1.union(s2)) # {1, 2, 3, 4, 5, 6, 7, 8, 9}
- # 差集
- # print(s1 - s2)# {1, 2, 3, 4, 5}
- # print(s2 - s1)# {8, 9}
- #st.difference(s2)
- #
- # #对等差分 [取反 交集]
- # print(s1 ^ s2) #{1, 2, 3, 4, 5, 8, 9}
- # 超集和子集
- boys = {'zzy','yqw','dw','wzc','lyb','wym','chy'}
- zoudu = {'wzc','lyb','wym'}
- girls = {'lsy','mmf','syj'}
- #issuperset() 检测当前集合是否是另一个集合的超集
- result = boys.issuperset(zoudu)
- print(result)
- #issubset() 检测当前集合是否是另一个集合的子集
- result = zoudu.issubset(boys)
- print(result)
- #isdisjoint() 检测 2 个集合是否不存在交集 存在交集 False
- result = boys.isdisjoint(girls)
- print(result)
- # 删除
- # print(st)
- # print(len(st))
- st.remove('new element')# 删除指定的元素, 不存在报错
- st.remove(2)
- # print(st.pop())# 随机删除并且返回集合中某个值
- # print(st.pop())
- # print(st.pop())
- # print(st.pop())
- # print(st.pop())
- # print(st.pop())
- # print(st.pop())# 假如集合没有元素了, 会报错 KeyError: 'pop from an empty set'
- st.discard(3)
- st.discard(3)# 删除指定元素 假如元素不存在 不会报错
- # 清空集合
- st.clear()
- # 赋值集合
- new_st =st.copy()
- print(st)
- dic = {k: v for k, v in enumerate(range(2, 6))}
- # {0, 1, 't', 7, 8, 9}
- print("dic type:%s dic value:%s" % (type(dic), dic))
- # dic type:<class 'dict'> dic value:{0: 2, 1: 3, 2: 4, 3: 5}
- print('dic.pop:%s' % dic.pop(2)) # dic.pop:4
成员检测:
- result_in = 2 in st
- result_not = 2 not in st
- print(result_in)
- print(result_not)
集合推导式:
st_1 = { key_value for key_value in range(2,8) }
带有判断的集合推导式
- st_2 = { key_value for key_value in range(2,17) if (key_value%2)==1 }
- # 冰冻集合
- # 冰冻集合是一种特殊的集合类型, 也是集合 (集合是列表的话, 冰冻集合就是元组)
- # 创建冰冻集合
- # 一般不会创建空的冰冻集合
- var = frozenset()
- print(var,type(var))
- # 带有数据的冰冻集合
- var = frozenset(('qs','szx','bjh','acs'))# 不可变集合
- print(var,type(var))
- # 成员检测
- result = 'szx' in var
- print(result)
- # 遍历冰冻集合
- for i in var:
- print(i)
- # 集合推导式 (无法得到冰冻集合, 可以得到集合, 列表, 元组, 字典类型)
- result = {i for i in var}
- print(result,type(result))
- # 函数
- # 冰冻集合可以使用集合的函数 (不修改集合本身的函数都可以使用)
- var = frozenset(('qs','szx','bjh','acs'))
- #copy()
- result = var.copy()
- print(result)
- # 集合操作 交集, 并集, 差集, 对称差集等 不修改冰冻集合本身就能使用: 冰冻集合的操作结果都是冰冻集合
- var1 = frozenset(('qs','szx','bjh','acs'))
- var2 = {'szx','bjh','lc','wb'}
- # 冰冻集合操作
- result = var1.union(var2)
- print(result)
- # 普通集合操作 (冰冻集合是参考集合)
- result = var2.union(var1)
- print(result)
来源: http://www.bubuko.com/infodetail-2676744.html