Python基本数据结构之集合
一道python面试的一个小问题,说怎么使用一行代码将一个列表里的重复元素,其实这里只要将列表转换成集合就可以了。
定义
集合跟我们学的列表有点像,也是可以存一堆数据,不过它有几个独特的特点,令其在整个Python语言中占有一席之地,
- 里面的元素不可变,代表你不能存一个list、dict 在集合里,字符串、数字、元组等不可变类型可以存
- 天生去重,在集合里没办法存重复的元素
- 无序,不像列表一样通过索引来标记在列表中的位置 ,元素是无序的,集合中的元素没有先后之分,如集合{3,4,5}和{3,5,4}算作同一个集合
基于上面的特性,我们可以用集合来干2件事,去重和关系运算
1 li=[1,1,'li']
2 a=set(li) # 可变集合/‘
3 print(a)
4 b=set('xiaohu 123')
5 print(b) # set是无序不重复的 # 如果要取值 1、for循环 2、迭代器
集合对象是一组无序排列的可哈希的值:集合成员可以做字典的键
集合当中的交(1、 & 2、集合中的方法intersection()),并(1、 | 2、 集合中的方法union()),补(1、- 2、集合中的方法difference()),差(集合中的方法symmetric_difference())
1 pythons=['alex','egon','yuanhao','wupeiqi','gangdan','biubiu']
2 linuxs=['wupeiqi','oldboy','gangdan']
3
4 # 求既报名python,也报名linux的学生 ,这是用for循环实现两个集合的交集-----------------------------------------------------
5 l=[]
6 for item in pythons:
7 if item in linuxs:
8 l.append(item)
9 print(l)
10
11 # 求报名了python,没有报名linux的学生-----------------------------------------------------------------------------------
12 l=[]
13 for item in pythons:
14 if item not in linuxs:
15 l.append(item)
16 print(l)
17
18 # 求所有报名的孩子的集合 1、 | 2、 集合中的方法union()----------------------------------------------------------------
19 a=set(pythons)
20 b=set(linuxs)
21 s=a | b # 求两个集合的并集
22 print(s)
23 print(a.union(b)) # 和 | 效果一样,求两个集合的并集
24
25 # 求两个集合的交集 1、 & 2、集合中的方法intersection()----------------------------------------------------------------
26 a=set(pythons)
27 b=set(linuxs)
28 s= a & b
29 print(s)
30 print(a.intersection(b))
31
32 # 求补集----------------------------------------------------------------------------------------------------------------
33 a=set(pythons)
34 b=set(linuxs)
35 print(a-b) # {'biubiu', 'yuanhao', 'egon', 'alex'}
36 print(a.difference(b)) # {'biubiu', 'yuanhao', 'egon', 'alex'}
37 print(b-a) # {'oldboy'}
38 print(b.difference(a)) # {'oldboy'}
39
40 # 求没有同时报名python和linuxs的学生------------------------------------------------------------------------------------
41 a=set(pythons)
42 b=set(linuxs)
43 print(a^b)
44 print(a.symmetric_difference(b)) # {'yuanhao', 'alex', 'oldboy', 'biubiu', 'egon'}
45 print(b.symmetric_difference(a)) # {'oldboy', 'biubiu', 'yuanhao', 'egon', 'alex'}
集合中 >,>=,<,<= 父集,子集 (返回布尔值)
1 set1={1,2,3,4,5}
2 set2={1,2,3,4}
3
4 print(set1 >= set2)
5
6 print(set1.issuperset(set2)) # 完全包含的意思
7
8 print(set2 <= set1)
9
10 print(set2.issubset(set1)) # 子集
集合里的增与删
1、add()方法
1 set1.add(88) # 88是一个整体
2 print(set1)
3 print(set1.pop())
4 print(set1)
2、discard(),remove()方法
1 set1.discard(3) # 指定值删除
2 print(set1)
3 set1.remove(2) # 也是指定值删除
4 print(set1)
3、update()方法
1 set1.update('ops') # 与add的区别是添加几个不重复的
2 set1.update([123,'ooo'])
3 print(set1)
4、clear()方法
1 set1.update('ops') # 与add的区别是添加几个不重复的 2 set1.update([123,'ooo']) 3 print(set1)
在集合中添加元素用.add()方法,.pop方法不指定参数,随机删除,并且有返回值
单纯的删除:discard,remove 指定元素删除,元素不存在不报错,单纯的删除,没有返回值
update方法谁调用更新谁的集合
print(set('alex')==set('alexexex')) # 返回True
print(set('alex')<set('alexwwww')) # 返回True 因为右边包含左边