; Python内置数据结构——集合set | Linux运维部落

Python内置数据结构——集合set

集合

定义

  • set翻译为集合
  • collection翻译为集合类型,是一个较大的概念
  • set是一个可变的、无序的、不重复的元素组成的集合
  • set的元素要求必须可以hash,目前已学的不可hash的类型只有list、set
  • 元素不可以索引
  • set可以迭代

set的初始化

  • set_1 =set() #表示定义一个空集合set_1
  • set_1 =set(iterable) #讲一个可迭代对象的元组添加到set_1这个集合中

set的操作


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
-<span class="ruby"> add(elem)
</span>    增加一个元素到set中,如果元素存在则什么都不做
-<span class="ruby"> update(*others)
</span>    合并其他元素到set中,参数others必须是可迭代对象;属于就地修改
-<span class="ruby"> remove(elem)
</span>    从set中移除一个元素,元素若不存在,则报keyerror
-<span class="ruby"> discard(elem)
</span>    从set中移除一个元素,若不存在则什么都不做
-<span class="ruby"> pop()
</span>    移除并返回任意元素。若是空set则返回keyerror
-<span class="ruby"> clear()
</span>    移除所有元素,若set很大会引起GC(内存垃圾回收)
-<span class="ruby"> 修改
</span>    在set中,要么删除,要么添加,由于set是无序的,只有通过hash值来查找元素,修改就相当于先删除再添加
-<span class="ruby"> 查询
</span>    非线性结构,无法索引;除非知道某个值确切再set中,通过hash值来查看
-<span class="ruby"> 遍历
</span>    可以迭代所有元素,
-<span class="ruby"> 成员运算符
</span>    in和not in判断元素是否再set中,由于是通过hash值来查找的,所以效率为O(1)

set和线性结构

  • 线性结构的查询时间复杂度是O(n),随着数据规模增大而增大加耗时
  • set、dict(dictionary字典)等结构,内部使用hash值作为key,时间复杂度可以做到O(1),查询时间和数据规模无关
  • 可hash
    
    
    1
    2
    3
    4
    5
    6
    -<span class="ruby"> 数值型int、float、complex
    </span>-<span class="ruby"> bool型True、False
    </span>-<span class="ruby"> 字符串string、bytes
    </span>-<span class="ruby"> 元组tuple
    </span>-<span class="ruby"> None
    </span>以上都是不可变类型,成为可hash类型(hashable)
  • set的元素必须是可hash的

集合的概念

  • 基本概念

1
2
3
4
5
6
7
8
9
-<span class="ruby"> 全集
</span>    所有元素的集合。例如正整数集,所有正整数组成的集合
-<span class="ruby"> 子集subset和超集superset
</span>    集合A的所有元素都在集合B中,称A是B的子集,B是A的超集
-<span class="ruby"> 真子集和真超集
</span>    A是B的子集,且A的元素比B少,则称A是B的真子集,B是A的真超集
-<span class="ruby"> 并集是多个集合合并的结果
</span>-<span class="ruby"> 交集是多个集合的公共部分
</span>-<span class="ruby"> 差集是集合中出去交集外的部分</span>
  • 集合运算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
1. 并集
将两个集合A和B的所有元素合并到一起,组成的集合叫A和B的并集
    -<span class="ruby"> union(*others)    返回和多个集合合并后的新的集合,例:s1.union(s2[,s3])
</span>    -<span class="ruby"> <span class="hljs-string">'|'</span>运算符重载 等同于union,例:s1<span class="hljs-params">|s2[|</span>s3]
</span>    -<span class="ruby"> update(*others)   和多个集合合并,就地修改,例:s1.update(s2[,s3])
</span>    -<span class="ruby"> <span class="hljs-string">'|='</span>  等同于update,例:s1<span class="hljs-params">|= s2 [|</span> s3]
</span>
2. 交集
集合A和集合B中所有同时属于A和B的元素组成的集合叫A和b的交集
    -<span class="ruby"> intersection(*others) 返回多个集合的交集
</span>    -<span class="ruby"> <span class="hljs-string">'&amp;'</span>   等同于intersection
</span>    -<span class="ruby"> intersection_update(*others)  获取多个集合的交集,就地修改
</span>    -<span class="ruby"> <span class="hljs-string">'&amp;='</span>  等同于intersection_update
</span>    
3. 差集
集合A和B,所有属于A切不属于B的元素组成的的集合
    -<span class="ruby"> difference(*othens)   返回多个集合的差集
</span>    -<span class="ruby"> <span class="hljs-string">'-'</span>   等同于difference
</span>    -<span class="ruby"> difference_update(*others)返回多个集合的差集并就地修改
</span>    -<span class="ruby"> <span class="hljs-string">'-='</span>  等同difference_update
</span>
4. 对称差集
集合A和B,有所欲不属于A和B的交集元素组成的集合称为对称差集
    -<span class="ruby"> symmetric_difference(other)   返回另一个集合的差集
</span>    -<span class="ruby"> <span class="hljs-string">'^'</span>   等同于symmetric_difference
</span>    -<span class="ruby"> symmetric_difference_update(other)    获取和另一个集合的差集并就地修改
</span>    -<span class="ruby"> <span class="hljs-string">'^='</span>  等同于symmetric_difference_update
</span>
-<span class="ruby"> issubnet(other)、&lt;=
</span>    判断当前集合是不是另一个集合的子集
-<span class="ruby"> set1 &lt; set2
</span>    判断set1是不是set2的真子集
-<span class="ruby"> issuperset(other)、&gt;=
</span>    判断当前集合是不是other的超集
-<span class="ruby"> set1 &gt; set2
</span>    判断set1是不是set2的正超集
-<span class="ruby"> isdisjoint(other)
</span>    当前集合和另一个集合没有交集返回True,有交集返回False

练习

  • 随机产生2组10个数字的列表,取值范围[10,20]
    1. 统计20个数字中有多少个不同的数字
    2. 2组中,不重复的数字有几个,是什么
    3. 两组中重复的数字有几个是什么

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import random


fst_nums = []
sec_nums = []
<span class="hljs-keyword">for</span> _ <span class="hljs-keyword">in</span> range(<span class="hljs-number">10</span>):
    fst_nums.append(random.randint(<span class="hljs-number">10</span>,<span class="hljs-number">20</span>))
    sec_nums.append(random.randint(<span class="hljs-number">10</span>,<span class="hljs-number">20</span>))
<span class="hljs-function"><span class="hljs-title">print</span><span class="hljs-params">(fst_nums,sec_nums)</span></span>    <span class="hljs-selector-id">#created</span> random sequence
<span class="hljs-function"><span class="hljs-title">print</span><span class="hljs-params">()</span></span>

fst_nums,sec_nums = set(fst_nums),set(sec_nums)

<span class="hljs-function"><span class="hljs-title">print</span><span class="hljs-params">(fst_nums|sec_nums)</span></span>
<span class="hljs-function"><span class="hljs-title">print</span><span class="hljs-params">(fst_nums ^ sec_nums)</span></span>
<span class="hljs-function"><span class="hljs-title">print</span><span class="hljs-params">(fst_nums &amp; sec_nums)</span></span>

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:/87628

发表评论

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

联系我们

400-080-6560

在线咨询:点击这里给我发消息

邮件:1660809109@qq.com

工作时间:周一至周五,9:30-18:30,节假日同时也值班

友情链接:万达娱乐开户  万达娱乐注册  万达娱乐注册  华宇招商  万达招商  万达注册  万达主管  guoqibee.com  guoqibee.com  测试