用set对象实现集合操作

2020年10月17日 / 5次阅读 / Last Modified 2020年10月17日
Set

set在英文中就是集合的意思,python内置了set对象,我们可以很方便的用set对象实现各种集合操作。

学习set集合操作,我的需求来自对json文件的输入合法性判断问题。

并集

使用set对象的union函数,或者 | 操作符:

>>> a
{1, 2, 3}
>>> b
{3, 4, 5}
>>> a.union(b)
{1, 2, 3, 4, 5}
>>> b.union(a)
{1, 2, 3, 4, 5}
>>> a
{1, 2, 3}
>>> b
{3, 4, 5}
>>> a | b
{1, 2, 3, 4, 5}

用 + 号是不行的。

用union合并,需要用一个额外的变量来指向合并后的结构,也可以使用update,直接用原来的变量来指向合并后的结果:

>>> a
{1, 2, 3}
>>> b
{3, 4, 5}
>>> a.update(b)
>>> a
{1, 2, 3, 4, 5}
>>> b
{3, 4, 5}
>>>
>>> b.update(a)
>>> b
{1, 2, 3, 4, 5}

交集

使用intersection函数,或者 & 操作符:

>>> a = {1,2,3}
>>> b = {3,4,5}
>>> c = a.intersection(b)
>>> c
{3}
>>>
>>> a
{1, 2, 3}
>>> b
{3, 4, 5}
>>> c = a & b
>>> c
{3}

注意intersection_update函数与update的区别:

>>> a = {1,2,3}
>>> a.intersection({3,4,5})
{3}
>>> a
{1, 2, 3}
>>> a.intersection_update({3,4,5})
>>> a
{3}
>>>
>>> b = {3,4,5}
>>> b.update({1,2,3})
>>> b
{1, 2, 3, 4, 5}

集合的差

有两个set,a和b,判断元素在a中而不在b中的方法,可以直接用 - 操作符,或者difference函数:

>>> a
{1, 2, 3}
>>> b
{3, 4, 5}
>>> a-b
{1, 2}
>>> b-a
{4, 5}
>>> a
{1, 2, 3}
>>> b
{3, 4, 5}
>>> a.difference(b)
{1, 2}
>>> b.difference(a)
{4, 5}

还有 difference_update 函数:

>>> a = {1,2,3}
>>> a.difference({3,4,5})
{1, 2}
>>> a.difference_update({3,4,5})
>>> a
{1, 2}

判断两个集合是否相交

用两个set交际是否为空可以判断:

>>> a
{1, 2}
>>> b
{3, 4, 5}
>>> a & b == set()
True

更优雅的方法,使用isdisjoint函数:

>>> a
{1, 2, 3}
>>> b
{3, 4, 5}
>>> a.isdisjoint(b)
False
>>> b.isdisjoint(a)
False
>>> a = {1,2}
>>> a.isdisjoint(b)
True
>>> b.isdisjoint(a)
True

子集

用交集是否与子集相同,可以判断是否为某个集合的子集:

>>> b
{3, 4, 5}
>>> c
{3}
>>> c & b == c
True

更优雅的方式,是使用issubset函数:

>>> b
{3, 4, 5}
>>> c
{3}
>>> c.issubset(b)
True
>>> b.issubset(c)
False

超集

可以用合并后是否与自己相同来判断是否为对方的超集:

>>> c
{3}
>>> b
{3, 4, 5}
>>> b | c == b
True

更优雅的方法,是用issuperset函数:

>>> b
{3, 4, 5}
>>> c
{3}
>>> b.issuperset(c)
True
>>> b.issuperset(b)
True

对称差(symmetric difference)

有的时候,我们需要判断,某个元素只出现在一个集合中。

>>> a
{1, 2, 3}
>>> b
{3, 4, 5}
>>> (a|b) - (a&b)
{1, 2, 4, 5}
>>> a ^ b
{1, 2, 4, 5}

set对象有个成员函数,symmetric_difference,干同样的事情,我就是觉得这个函数名太长了:

>>> a = {1,2,3}
>>> b = {3,4,5}
>>> a.symmetric_difference(b)
{1, 2, 4, 5}
>>> b.symmetric_difference(a)
{1, 2, 4, 5}

还有个symmetric_difference_update函数,用来更新set对象,这个更新是覆盖更新,与update函数不一样:

>>> a = {1,2,3}
>>> a.symmetric_difference_update({3,4,5})
>>> a
{1, 2, 4, 5}
>>>
>>> a = {1,2,3}
>>> a.update({3,4,5})
>>> a
{1, 2, 3, 4, 5}

difference_update,intersection_update,symmetric_difference_update,注意这3个函数与update的区别!

-- EOF --

本文链接:https://www.pynote.net/archives/2582

留言区

电子邮件地址不会被公开。 必填项已用*标注


前一篇:
后一篇:

More


©Copyright 麦新杰 Since 2019 Python笔记

go to top