Python攻克之路-集合(set)

集合:把不同的元素组成一起形成集合,是Python基本的数据类型
两大作用:
a.去重
b.关系测试

1.去重
注:集合元素:组成集合的成员不可重复

In [9]: s=set('reid liu')
In [10]: print(s)
{'u', 'i', 'l', 'e', ' ', 'r', 'd'} ##如果有重复,只会保留一个,所以重要作用是去重

把列表去重

In [11]: s1=['reid','lucy','lucy','lucy']
In [12]: print(set(s1))
{'reid', 'lucy'}
In [13]: type(set(s1))
Out[13]: set

去重后转换成列表

In [14]: s1=['reid','lucy','lucy','lucy']
In [15]: list(set(s1))
Out[15]: ['reid', 'lucy']

  

2.集合的特征
集合对象是一组无序排列的可哈希的值,集合成员可以做字典的键
可哈希:字典的key,必须是一个不可变类型,可以是整型,字符串,就能是列表和元组

In [16]: num=[[1,2],4,'reid']
In [17]: set(num)
TypeError: unhashable type: 'list' #列表不可哈希

集合是无序
描述:它没有键,也没有索引,要取值只能通过for循环和迭代器来实现

集合分类:可变集合和不可变集合
可变集合(set):可添加和删除元素,set整体非可哈希的,不能用作字典的键,也不能做其他集合元素
不可变集合(frozenset): 与上面相反,不能添加修改集合,类似于list和tuple

In [18]: wu=[1,'a','b']
In [20]: s=set(wu) 
In [21]: dic={s:'123'} ##set整体是非可哈希的,意味着不s不能作为字典的键
TypeError: unhashable type: 'set'

  

3.集合的相关操作
a.创建集合
由于集合没有自己的语法格式,只能通过集合的工厂方法set()和frozenset()创建

In [1]: s1=set('reid')
In [2]: s2=frozenset('liu')
In [3]: print(s1,type(s1))
{'e', 'd', 'r', 'i'} <class 'set'> 
In [4]: print(s2,type(s2))
frozenset({'u', 'l', 'i'}) <class 'frozenset'>

  

b.访问集合
由于集合本身是无序的,所以不能为集合创建索引或切片操作,只能循环遍历或使用用in、not in来访问或判断集合元素

In [5]: s1=set('reid')
In [6]: print('r' in s1)
True
In [7]: print('b' in s1)
False

作为一个整体判断

In [11]: l1=[1,2,'reid']
In [12]: s=set(l1)
In [13]: print('rei' in s) 
False

不能切片

In [8]: s1[1]
TypeError: 'set' object does not support indexing #

可以循环打印

In [9]: for i in s1:
...: print(i)
...: 
e
d
r
i

  

c.更新集合相关操作
add添加一个元素

In [14]: l1=[1,2,'reid']
In [15]: s=set(l1)
In [16]: s.add('u')
In [17]: print(s)
{1, 2, 'reid', 'u'}
In [18]: s.add('uu')
In [19]: print(s)
{1, 2, 'u', 'uu', 'reid'}

update更新:作为一个序列添加

In [20]: l1=[1,2,'reid']
In [21]: s=set(l1)
In [22]: s.update('apt')
In [23]: print(s)
{1, 2, 'a', 't', 'reid', 'p'}
In [24]: s.update('pppe') ##重复只显示一个
In [25]: print(s)
{1, 2, 'e', 'a', 't', 'reid', 'p'}
In [26]: s.update([44,'lin']) ##添加列表
In [27]: print(s)
{1, 2, 'lin', 'e', 'a', 44, 't', 'reid', 'p'}

remove移除

In [28]: s.remove('reid')
In [29]: s
Out[29]: {1, 2, 44, 'a', 'e', 'lin', 'p', 't'}

pop弹出

In [30]: s.pop()
Out[30]: 1
In [31]: s
Out[31]: {2, 44, 'a', 'e', 'lin', 'p', 't'}

clear清空

In [32]: s.clear()
In [33]: s
Out[33]: set()

del删除

In [34]: del s
In [35]: s
NameError: name 's' is not defined

  

4.集合类型操作符
a. in, not in


b. 集合等价与不等价(==,!=)

In [37]: print(set('you')==set('yououou')) ##因为展开就是一个个字母显示的序列
True

  

c.关系测试
场景:如工作日上班打卡和周末上班打卡中,找出工作日与周末都有上班的人
交集

In [5]: a=set([1,2,3,4,5])
In [6]: b=set([4,5,6,7,8])
In [7]: a.intersection(b)
Out[7]: {4, 5}
In [16]: a & b
Out[16]: {4, 5}

并集

In [8]: a.union(b)
Out[8]: {1, 2, 3, 4, 5, 6, 7, 8}
In [12]: a | b
Out[12]: {1, 2, 3, 4, 5, 6, 7, 8}

差集

In [9]: a.difference(b) #a上有,b上没有
Out[9]: {1, 2, 3}
In [13]: a - b
Out[13]: {1, 2, 3}

In [10]: b.difference(a) #b上有,a上没有
Out[10]: {6, 7, 8}
In [14]: b - a
Out[14]: {6, 7, 8}

反向交集(除了交集,也叫对称差集)

In [11]: a.symmetric_difference(b)
Out[11]: {1, 2, 3, 6, 7, 8}
In [15]: a ^ b
Out[15]: {1, 2, 3, 6, 7, 8}

父集

In [17]: a.issuperset(b) ##a是否完全包含b
Out[17]: False
In [19]: a > b
Out[19]: False

子集

In [18]: a.issubset(b) ##a不是b的子集
Out[18]: False
In [20]: a < b
Out[20]: False

  

posted @ 2018-03-11 18:12  Reid21  阅读(144)  评论(0编辑  收藏  举报