Python学海无涯路【第06回】:集合

本文详细介绍了集合(set)的定义、方法、关系运算及其在去重和判断中的应用。


1、集合(set)的定义

由不同元素组成的集合,集合中是一组无序排列的可hash值,可以作为字典的key

  • 不同元素组成
  • 无序
  • 集合中元素必须是不可变 类型
  • 集合本身是可变类型
#集合
s={1,2,3,4,5}

或者

#!/usr/bin/env python
# -*- coding:utf-8 -*-
s=set("hello")		#定义集合,l只保留一个
print(s)

输出:
{‘h’, ‘e’, ‘o’, ‘l’}

下面这段程序不符合set的定义,

s={[1,2],3,4,5} #[1,2]是不可hash的类型
print(s)

报错:TypeError: unhashable type: ‘list’

2、集合的方法

2.1、add

#!/usr/bin/env python
# -*- coding:utf-8 -*-
s = {1, 2, 3}
s.add(4)
print(s)

输出:
{1, 2, 3, 4}

2.2、clear

#!/usr/bin/env python
# -*- coding:utf-8 -*-
s = {1, 2, 3}
s.clear()
print(s)

输出:
set()

2.3、pop

#!/usr/bin/env python
# -*- coding:utf-8 -*-
s = {"a",1, 2, 3}
v=s.pop()       #集合是无序的,故随机删除一个元素,并返回删除的这个元素
print(v,s)

输出:
1
{2, 3, ‘a’}

2.4、remove

#!/usr/bin/env python
# -*- coding:utf-8 -*-
s = {"a",1, 2, 3}
s.remove(3)   #删除指定元素,若删除元素不存在会报错
print(s)

输出:
{1, 2, ‘a’}

2.5、discard

#!/usr/bin/env python
# -*- coding:utf-8 -*-
s = {"a",1, 2, 3}
s.discard(3)        #删除集合中存在的指定元素
print(s)
s.discard(1111)     #删除集合中不存在的指定元素,不报错 
print(s)

输出:
{1, 2, ‘a’}
{1, 2, ‘a’}

2.6、difference_update

判断是否有交集

2.7、issubset

判断是否是子集

2.8、update

更新多个值
将一个集合赋给另一个集合
例1:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
a=set(["a","b"])
b=set(["cd"])
a.update(b)
print(a)

{‘b’, ‘cd’, ‘a’}
例2:

a={"a","b"}
a.update("cd")
print(a)

输出:{‘a’, ‘d’, ‘c’, ‘b’}

2.9、in

s={1,"abc",4,5}
print("abc" in s)  #在集合中返回True

输出:True

2.10、not in

s={1,"abc",4,5}
print("abc" not in s) #不在集合中返回True

输出:False

2.11、集合等价

集合等价返回True

s=set("abc")
s1=set("abcbbb")
print(s)
print(s1) #会去重
print(s==s1)

输出:
{‘a’, ‘b’, ‘c’}
{‘a’, ‘b’, ‘c’}
True

2.12、集合不等价

集合不等价返回True

s=set("abc")
s1=set("abcbbb")
print(s)
print(s1) #会去重
print(s!=s1)

输出:
{‘a’, ‘b’, ‘c’}
{‘a’, ‘b’, ‘c’}
False

3、集合的关系运算

3.1、交 集

#!/usr/bin/env python
# -*- coding:utf-8 -*-
a=set([1,2,3,4,5])
b=set([4,5,6])
v=a.intersection(b)
print("交集:",v)

输出:
交集: {4, 5}

3.2、差 集

#!/usr/bin/env python
# -*- coding:utf-8 -*-
a=set([1,2,3,4,5])
b=set([4,5,6])
v=a.difference(b)
print("差集:",v)
v=b.difference(a)
print("差集:",v)

输:
差集: {1, 2, 3}
差集: {6}

3.3、并 集

a=set([1,2,3,4,5])
b=set([4,5,6])
v=a.union(b)
print("并集:",v)

输出:
并集: {1, 2, 3, 4, 5, 6}

3.4、交差补集

交差补集=并集-交集

a=set([1,2,3,4,5])
b=set([4,5,6])
v=a.symmetric_difference(b)
print("交差补集:",v)

交差补集: {1, 2, 3, 6}

3.5、求完差集,并赋值回去

#!/usr/bin/env python
# -*- coding:utf-8 -*-
a=set([1,2,3,4,5])
b=set([4,5,6])
a.difference_update(b) #求完差集,并赋值
print("求完差集,并赋值:",a)
a=a-b
print("求完差集,并赋值:",a)

输:
求完差集,并赋值: {1, 2, 3}
求完差集,并赋值: {1, 2, 3}

3.6、判断是否有交集

#!/usr/bin/env python
# -*- coding:utf-8 -*-
a=set([1,2,3,4,5])
b=set([4,5,6])
c={7,8}
v=a.isdisjoint(b)   #有交集返False
print(v)
v=a.isdisjoint(c)   #无交集返True
print(v)

输出:
False
True

3.7、判断是否是子集

#!/usr/bin/env python
# -*- coding:utf-8 -*-
a=set([1,2,3,4,5])
b=set([4,5,6])
c={1,2,3,4,5,6}
v=a.issubset(b) #前者不是后者的子集,返False
print(v)
v=a.issubset(c) #前者是后者的子集,返True
print(v)

输出:
False
True

3.8、判断是否是父集

a=set([1,2,3])
b={1,2,3,4,5,6}
v=a.issuperset(b) #前者不是后者的父集,返False
print(v)
v=b.issuperset(a) #前者是后者的父集,返True
print(v)

输出:
False
True

3.9、集合的关系统运算符

a=set([1,2,3,4,5])
b=set([4,5,6,7])
c={1,2,3}

print(a | b)    #并集
print(a & b)    #交集
print(a - b)    #差集
print(b - a)    #差集
print(a ^ b)    #对称差集,相当于并集-交集
print(a > c)    #a是c的父集
print(c < a)    #c是a的子集

输出:
{1, 2, 3, 4, 5, 6, 7}
{4, 5}
{1, 2, 3}
{6, 7}
{1, 2, 3, 6, 7}
True
True

4、不可变类型的集合

frozenset是冻结的集合,它是不可变的,存在哈希值,好处是它可以作为字典的key,也可以作为其它集合的元素。缺点是一旦创建便不能更改,没有add,remove方法。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
a={1,2,3}
b=frozenset(a)
print(b)

输出:
frozenset({1, 2, 3})

5、用集合去重

用这种方法去重会打乱原来的排列顺序

#!/usr/bin/env python
# -*- coding:utf-8 -*-
s = ["Jim", "Tom", "Jim","LeiLi"]
s = list(set(s))
print(s)

输出:
[‘LeiLi’, ‘Jim’, ‘Tom’]

5、集合的两大用途

  • 去重
  • 关系运算
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值