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

集合

定义

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

set的初始化

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

set的操作

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

set和线性结构

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

集合的概念

  • 基本概念
- 全集
    所有元素的集合。例如正整数集,所有正整数组成的集合
- 子集subset和超集superset
    集合A的所有元素都在集合B中,称A是B的子集,B是A的超集
- 真子集和真超集
    A是B的子集,且A的元素比B少,则称A是B的真子集,B是A的真超集
- 并集是多个集合合并的结果
- 交集是多个集合的公共部分
- 差集是集合中出去交集外的部分
  • 集合运算
1. 并集
将两个集合A和B的所有元素合并到一起,组成的集合叫A和B的并集
    - union(*others)    返回和多个集合合并后的新的集合,例:s1.union(s2[,s3])
    - '|'运算符重载 等同于union,例:s1|s2[|s3]
    - update(*others)   和多个集合合并,就地修改,例:s1.update(s2[,s3])
    - '|='  等同于update,例:s1|= s2 [| s3]

2. 交集
集合A和集合B中所有同时属于A和B的元素组成的集合叫A和b的交集
    - intersection(*others) 返回多个集合的交集
    - '&'   等同于intersection
    - intersection_update(*others)  获取多个集合的交集,就地修改
    - '&='  等同于intersection_update
    
3. 差集
集合A和B,所有属于A切不属于B的元素组成的的集合
    - difference(*othens)   返回多个集合的差集
    - '-'   等同于difference
    - difference_update(*others)返回多个集合的差集并就地修改
    - '-='  等同difference_update

4. 对称差集
集合A和B,有所欲不属于A和B的交集元素组成的集合称为对称差集
    - symmetric_difference(other)   返回另一个集合的差集
    - '^'   等同于symmetric_difference
    - symmetric_difference_update(other)    获取和另一个集合的差集并就地修改
    - '^='  等同于symmetric_difference_update

- issubnet(other)、<=
    判断当前集合是不是另一个集合的子集
- set1 < set2
    判断set1是不是set2的真子集
- issuperset(other)、>=
    判断当前集合是不是other的超集
- set1 > set2 
    判断set1是不是set2的正超集
- isdisjoint(other)
    当前集合和另一个集合没有交集返回True,有交集返回False

练习

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


fst_nums = []
sec_nums = []
for _ in range(10):
    fst_nums.append(random.randint(10,20))
    sec_nums.append(random.randint(10,20))
print(fst_nums,sec_nums)    #created random sequence
print()

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

print(fst_nums|sec_nums)
print(fst_nums ^ sec_nums)
print(fst_nums & sec_nums)

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/87626

(0)
KX_ilKX_il
上一篇 2017-10-02 11:56
下一篇 2017-10-03 09:29

相关推荐

  • Linux部分命令及使用

    Linux部分命令解释及使用 ASCII 信息交换码  GB2312 big5 UTF-8 字符集 乱码问题 生产环境中最常见故障  字符集格式设置不一致 查看系统版本  cat /etc/redhat-release  $() “&nb…

    2017-04-09
  • Linux系统初始化流程:系统初始化相关基础知识

    Linux系统初始化流程:系统初始化相关基础知识 内核简介 内核的功能 进程管理:通过task_struct, scheduler 实现 内存管理 I/O管理:中断以及中断处理 文件系统管理:ext3,ext4,xfs 等 驱动程序 安全相关:SELinux,各种加密库 通用软件,平台相关软件 内核设计流派 单内核:单一体系结构 linux 为单一内核 模块…

    2015-02-28
  • 软件包管理器之一——RPM介绍及应用

    一、前言:     在没有软件包管理器前,用户都是通过源代码的方式来安装软件。但是我们很容易发现,在每次安装软件时都必须对操作系统的境、编译的参数进行对应的编译,并且操作过程很是复杂,这对于不熟悉操作系统的朋友来说真心困难,那么有没有一款软件能让用户能很简单的安装所需的软件呢?    &n…

    Linux干货 2015-07-20
  • shell脚本实现MD5破解的相关小计

    分享编写shell脚本暴力破解md5的方法 方法一 单个破解法(以10位数为例) #!/bin/bash read -p “please input strings:”string for n in {0..33000} do Md5=`echo $n |md5sum|cut -c 1-10`      …

    Linux干货 2017-03-26
  • 计算机的组成及Linux简单介绍

    马哥教育网络班22期第一周练习 计算机概述 进入计算机的世界 计算机 计算机(computer)俗称电脑,是能够按照程序运行,自动、高速出炉海量数据的现代化智能电子设备。由硬件系统和软件系统所组成,计算机的组成遵循冯诺依曼体系。可分为超级计算机、工业控制计算机、网络计算机、个人计算机和嵌入式计算机等五类,较先进的计算机有生物计算机、光子计算机、量子计算机等。…

    Linux干货 2016-08-14
  • 8.5-文本处理工具(命令篇)

     1、文件查看命令: cat, tac,rev cat [OPTION]… [FILE]…     -E: 显示行结束符$     -n: 对显示出的每一行进行编号     -A:显…

    Linux干货 2016-08-07