基本数据类型-Set

概念和基础

集合(set),由一个或多个确定的元素所构成的整体,是一个无序不重复元素的序列,可以使用大括号{}或者set()函数创建集合,注意:创建空集合只能使用set(),如果使用{}创建的是一个空字典,集合存在的意义就在于去重和关系运算。
创建格式:

param = {value1, value2, ...}
or
param = set(value)

快速判断元素是否在集合内使用可以使用in,如果存在的话返回True,否则返回False

e.g.
value in param

去重演示:

>>>set_test = set('hello')
>>>set_test
{'h', 'e', 'l', 'o'}

集合中的元素有三个特征:

  1. 确定性(必须可哈希)
  2. 互异性(去重)
  3. 无序性(集合中的元素没有先后之分,集合{2,3,4}和集合{3,4,2}算是同一个集合)

注意:集合存在的意义就在于去重和关系运算

set在创建的时候有可变集合不可变集合两种,可变集合set(value)或者直接{value1, value2, …},不可变集合可以通过将可变集合改为不可变集合,

e.g. 
frozenset(set_name)

关系运算

差集

差集有差集和对称差集之分,差集是只在某一个集合中有,在另外一个集合中没有,对称差集是两个集合各自有的元素做并集并返回。

差集

可以使用集合的difference()方法或者使用符号"-"。

e.g.
>>>names1 = {'Jack', 'Alex'}
>>>names2 = {'Jack', 'Mark'}
>>>print(names1.difference(names2))  #只在集合names1中存在的元素
{'Alex'}
>>>print(names1 - names2)  #只在集合names1中存在的元素
{'Alex'}
对称差集

按照对对称差集的理解,可以通过对 set1 集合求对 set2 集合的差集,再并上 set2 集合对 set1 集合的差集,如下所示:

>>>names1 = {'Jack', 'Alex'}
>>>names2 = {'Jack', 'Mark'}
>>>names1_names2 = names1.difference(names2)  #求对于names1对names2的差集
>>>print(names2_names2)
{'Alex'}
>>>names2_names1 = names2.difference(names1)  #求对于names2对names1的差集
>>>print(names2_names1)
{'Mark'}
>>>names1_names2 | names2_names1
{'Alex', 'Mark'}

这种方法比较繁琐,需要对两个集合一次求另一个集合的差集,然后再求并集,python中直接提供了方法来实现对称差集,可以使用集合的symmetric_difference()或者使用符号"^"。

>>>names1 = {'Jack', 'Alex'}
>>>names2 = {'Jack', 'Mark'}
>>>print(names1.symmetric_difference(names2))  #只在集合names1中存在的元素
{'Alex', 'Mark'}
>>>print(names1 ^ names2)  #只在集合names1中存在的元素
{'Alex', 'Mark'}
交集

获取两个集合中重复的部分并返回,可以使用集合的intersection()方法,或者使用符号"&"。

e.g.
>>>names1 = {'Jack', 'Alex'}
>>>names2 = {'Jack', 'Mark'}
>>>print(names1.intersection(names2))
{'Jack'}
>>>print(names1 & names2)
{'Jack'}
并集

获取两个集合中所有的元素并去重,可以使用集合的union()方法,或者使用符号"|"。

e.g.
>>>names1 = {'Jack', 'Alex'}
>>>names2 = {'Jack', 'Mark'}
>>>print(names1.union(names2))
{'Mark', 'Alex', 'Jack'}
>>>print(names1 | names2)
{'Mark', 'Alex', 'Jack'}

常用操作

元素的增加

python 中元素的增加有两种类型,一种的单个元素的添加,一种是对序列的添加。

单个元素的添加

python 中单个元素的添加使用的是add()方法,add()的作用类似于列表中的append()方法。注意:使用该方法的时候不能添加可变数据类型,比如列表,错误提示:TypeError: unhashable type: ‘list’。

>>>set1 = {1, 2}
>>>set1.add(3)
{1, 2, 3}
>>>set1.add((4, 5))
{(4, 5), 1, 2, 3}
序列的添加

python中对序列的添加使用的是update()方法,update()方法的作用类似于列表中的extend()方法,序列包括但不限于列表、元组和字典,update方法支持同时传入多个参数。

>>> set1 = {1,2}
>>> set1.update([3,4],[1,2,7])
>>> set1
{1, 2, 3, 4, 7}
>>> set1.update("hello")  #在update字符串的时候比较特殊,是将每个字符拆开添加到集合中
>>> set1
{1, 2, 3, 4, 7, 'h', 'e', 'l', 'o'}
>>> set1.update(("hello", "world"))
{1, 2, 3, 4, 7, 'l', 'h', 'world', 'o', 'e', 'hello'}
元素的删除

集合中删除单个元素有三种方法,discard(),remove()和pop(),三者的区别:

  • set.discard(value)可以指定元素,并且无返回值,在元素不在集合里的时候不会抛出异常
  • set.remove(value)可以指定元素,,并且无返回值,如果元素不在集合里,会抛出KeyError错误
  • set.和pop()随机删除一个元素,不能指定,返回删除的元素,并且当集合为空的时候,会抛出KeyError错误

清空集合的方法:clear(),就算是一个空集合,清空的话也不会报错

>>> set1={1,2,3,4}
>>> set1.discard(1)
>>> set1
{2, 3, 4}
>>> set1.discard(1)  #元素不存在,解释器也没有报错
>>> set1
{2, 3, 4}
>>> set1.remove(1)
Traceback (most recent call last):
  File "<pyshell#31>", line 1, in <module>
    set1.remove(1)
KeyError: 1
>>> set1.clear()
>>> set1
set()
>>> set1.pop()
Traceback (most recent call last):
  File "<pyshell#34>", line 1, in <module>
    set1.pop()
KeyError: 'pop from an empty set'
>>> set1.clear()

猜你喜欢

转载自blog.csdn.net/microcosm8023/article/details/82887090