第二篇(七):集合

 

python 集合 集合标准操作

摘要: 说明: ·类似于数学中学的集合,Python中的集合可以实现去重的功能,通过set()函数来实现: ·sets支持x in set, len(set)和 for x in set; ·作为一个无序的集合,sets 不记录元素位置或者插入点,因此,sets不支持indexing, slicing,或...

说明:

·类似于数学中学的集合,Python中的集合可以实现去重的功能,通过set()函数来实现:

·sets支持x in set, len(set)和 for x in set;

·作为一个无序的集合,sets 不记录元素位置或者插入点,因此,sets不支持indexing, slicing,或其它类序列(sequence-like)的操作;

·学习集合,主要是学习集合的一系列标准操作:集合创建、集合添加、集合删除、交并差集等;


1.创建集合:set()

1
2
3
4
5
6
7
8
9
10
11
>>> a = range(10)
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a.insert(3,8)
>>> a.insert(3,6)
>>> a
[0, 1, 2, 6, 8, 3, 4, 5, 6, 7, 8, 9]
>>> set(a)
set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> set('boy')
set(['y', 'b', 'o'])

2.集合添加:add()与update

--add()

·功能:把要添加的元素作为一个整体添加到集合中;

·演示如下:

1
2
3
4
5
6
>>> a = set('boy')
>>> a
set(['y', 'b', 'o'])
>>> a.add('xpleaf')
>>> a
set(['y', 'b', 'xpleaf', 'o'])

·add()的参数不能为列表和字典,但是可以为元组:

1
2
3
4
5
6
>>> b = set('Hello')
>>> b
set(['H', 'e', 'l', 'o'])
>>> b.add(('xpleaf','CL'))
>>> b
set(['H', ('xpleaf', 'CL'), 'e', 'l', 'o'])

--update()

·功能:把要添加的元素拆分(如果不是单个字符),再一个一个地添加到集合中;

·演示如下:

1
2
3
4
5
6
7
8
>>> a
set(['y', 'b', 'xpleaf', 'o'])
>>> a.update('Python')
>>> a
set(['b', 'h', 'xpleaf', 'n', 'P', 'o', 'y', 't'])
>>> a.update([1,2,3])
>>> a
set([1, 2, 'b', 'h', 'xpleaf', 'n', 'P', 3, 'o', 'y', 't'])

·前面讲集合是不支持indexing的,所以这里看到新添加的元素在集合中是无序排列的;


3.集合删除:remove(),discard()与pop()

--remove()

·功能:从set中删除元素,如果不存在则引发KeyError;

·演示如下:

1
2
3
4
5
6
7
8
9
>>> a
set([1, 2, 'b', 'h', 'xpleaf', 'n', 'P', 3, 'o', 'y', 't'])
>>> a.remove('b')
>>> a
set([1, 2, 'h', 'xpleaf', 'n', 'P', 3, 'o', 'y', 't'])
>>> a.remove('KeyError')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'KeyError'

--discard()

·功能:如果在set中存在该元素,则删除,无论存在与否,都没有提示;

·演示如下:

1
2
3
4
5
6
7
8
9
>>> a
set([1, 2, 3, 'h', 'xpleaf', 'n', 'P', 'o', 'y', 't'])
>>> import tab
>>> a.discard('xpleaf')
>>> a
set([1, 2, 3, 'h', 'n', 'P', 'o', 'y', 't'])
>>> a.discard('CL')
>>> a
set([1, 2, 3, 'h', 'n', 'P', 'o', 'y', 't'])

--pop()

·功能:删除并返回set中一个不确定的元素;

·演示如下:

1
2
3
4
5
6
7
8
9
10
>>> a.pop()
1
>>> a
set([2, 3, 'h', 'n', 'P', 'o', 'y', 't'])
>>> a.pop()
2
>>> a.pop()
3
>>> a
set(['h', 'n', 'P', 'o', 'y', 't'])

4.集合数学操作

·进行数学操作需要了解一些集合操作符号和数学符号:

数学符号 Python符号 含义
-或\ - 差集,相对补集
∩ & 交集
∪ | 并集
取∩的补 ^ 对称差集
≠ !=

不等于

= == 等于
∈ in 属于
  not in 不属于

--差集,相对补集:-

1
2
3
4
5
6
7
8
9
10
>>> a = set(range(10))
>>> b = set(range(15))
>>> a
set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> b
set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
>>> b - a
set([10, 11, 12, 13, 14])
>>> a - b
set([])

--交集:&

1
2
>>> a & b
set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

·也可以用intersection()函数实现:

1
2
>>> a.intersection(b)
set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

--并集:|

1
2
>>> a | b
set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])

·也可以用union()函数实现:

1
2
>>> a.union(b)
set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])

--对称差集:^

1
2
3
4
5
set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> b
set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
>>> a ^ b
set([10, 11, 12, 13, 14])

·也可以用symmetric_difference()函数实现:

1
2
3
4
>>> a.symmetric_difference(b)
set([10, 11, 12, 13, 14])
>>> b.symmetric_difference(a)
set([10, 11, 12, 13, 14])

--等于与不等于:==与!=

1
2
3
4
>>> a == b
False
>>> a != b
True

--属于与不属于:in与not in

1
2
3
4
5
6
7
8
9
10
11
12
>>> a
set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> b
set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
>>> a in b
False
>>> b in a
False
>>> a not in b
True
>>> 0 in a
True

·指的是元素是否属于集合,而不是集合之间的包含;

·集合之间的包含(子集)可用:>、>=、<、<=等表示

1
2
3
4
>>> a >= b
False
>>> a <= b
True

·<=相当于函数issubset():

1
2
3
4
>>> a <= b
True
>>> a.issubset(b)    ===>a是b的子集
True

·>=相当于函数issuperset():

1
2
3
4
5
6
>>> a >= b
False
>>> a.issuperset(b)    ===>a不是b的超集,即a不包含b
False
>>> b.issuperset(a)    ===>b是a的超集,即b包含a
True

5.其它操作

--len()

·功能:测定集合的长度;

·演示如下:

1
2
3
4
>>> len(a)
10
>>> len(b)
15

--copy()

·功能:浅复制;

·前面已有提及,不再重复;

--hash()

·功能:返回参数的哈希值;

·演示如下:

1
2
3
4
5
6
7
8
>>> a
set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> b
set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
>>> hash(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'set'

·可以看到普通hash()函数的参数不能为set类型(列表也不行),但可以为字符串类型:

1
2
>>> hash('CL')
8576051523077447

·只要数据量足够大,hash是有可能产生相同的hash值,更安全的为md5类型的hash值计算:

1
2
3
4
5
>>> import hashlib
>>> a = 'hello'
>>> a = hashlib.md5()
>>> a.hexdigest()
'd41d8cd98f00b204e9800998ecf8427e'

·可以看到产生的hash值中还包含有字母等字符,因此破解的难度会更大。

python-集合(第二篇(七):集合)的更多相关文章

  1. Python人工智能第二篇:人脸检测和图像识别

    Python人工智能第二篇:人脸检测和图像识别 人脸检测 详细内容请看技术文档:https://ai.baidu.com/docs#/Face-Python-SDK/top from aip impo ...

  2. Java-集合第二篇Set集合

    1.Set集合与Collection基本相同,没有提供额外的方法.实际上Set就是Collection,只是行为略有所不同(Set不允许有重复元素). Set下的HashSet.TreeSet.Enu ...

  3. Python人工智能第二篇

    Python人工智能之路 - 第二篇 : 现成的技术   预备资料: 1.FFmpeg: 链接:https://pan.baidu.com/s/1jonSAa_TG2XuaJEy3iTmHg 密码:w ...

  4. SVN第二篇-----命令集合

    16.switch  代码库URL变更 svn switch (sw): 更新工作副本至不同的URL. 用法:  1.switch URL [PATH]         更新你的工作副本,映射到一个新 ...

  5. [Python笔记]第二篇:运算符、基本数据类型

    本篇主要内容有:运算符 基本数据类型等 一.运算符 1.算术运算 2.比较运算 3.赋值运算 4.逻辑运算 5.成员运算 6.身份运算 7.位运算 8.运算符优先级 二.基本数据类型 1.整数:int ...

  6. python初识第二篇

    python 编码: 第一次编程有时候会遇到乱码的情况,就可以通过以下的情况来解决 在Windows中默认的就是gbk编码,如果在代码头两部定义utf-8,系统还会按照系统的方式来定义. python ...

  7. Python【第二篇】运算符及优先级、数据类型及常用操作、深浅拷贝

    一.运算符及优先级 Python 运算符(算术运算.比较运算.赋值运算.逻辑运算.成员运算) 1.算数运算符 运算符 描述 实例,a=20,b=10 + 加 a+b输出结果30 - 减 a-b输出结果 ...

  8. python基础-第二篇-基本数据类型

    一.运算符 1.算数运算: 算数运算符相信大家都不陌生吧,尤其是加减乘除,好!那我就带着大家看看最后三个,这三个到底是干什么玩意的? %,取两数相除的余数,看图: **,x的多少次幂,看图: //,取 ...

  9. 图解Python 【第二篇】:Python基础2

    本节内容一览图 一.数据类型 1.数字 2 是一个整数的例子.长整数 不过是大一些的整数.3.23和52.3E-4是浮点数的例子.E标记表示10的幂.在这里,52.3E-4表示52.3 * 10-4. ...

  10. Python基础第二篇

    一.三元运算 if True: name='a' else: name='b' #上面的代码用三元运算表示: name="a" if True else "b" ...

随机推荐

  1. Python处理XML

    在Python(以及其他编程语言)内有两种常见的方法处理XML:SAX(Simple API for XML)和DOM(Document Object Model,文档对象模型).SAX语法分析器读取 ...

  2. Mac上RoR环境搭建问题

    昨天一晚上折磨的我啊都快疯掉了. 按照http://railstutorial-china.org方法配制,到rvm requirements这个命令执行时就麻烦事来了. WutekiMacBook- ...

  3. 流形学习(manifold learning)的一些综述

    流形学习(manifold learning)的一些综述 讨论与进展 issue 26 https://github.com/memect/hao/issues/26 Introduction htt ...

  4. apk,task,android:process与android:sharedUserId的区别

    apk一般占一个dalvik,一个进程,一个task.通过设置也可以多个进程,占多个task. task是一个activity的栈,其中"可能"含有来自多个App的activity ...

  5. 【POJ】2117 Electricity

    无向图求割点和连通块. /* POJ2117 */ #include <iostream> #include <vector> #include <algorithm&g ...

  6. What does the number on the visual studio solution icon represent?

    The numbers correspond to the internal version numbers of various editions of Visual Studio http://e ...

  7. poj2954

    水题,先用叉积求三角形面积然后求三边上的点(由公约数上点)a然后用pick定理S=a+b/2-1就可以求出内部的点数了 var x,y,xx,yy,a1,a2,a3,x1,x2,x3,y1,y2,y3 ...

  8. Eclipse C/C++环境配置

    一.C/C++环境配置: Window - Preferences - C/C++ 1. Editor - Content Assist - Auto-Activation - Delay(ms),原 ...

  9. 【转】Unity3D NGUI事件 UIEvents

    原创文章如需转载请注明:转载自 脱莫柔Unity3D学习之旅 QQ群:[119706192] 本文链接地址: Unity3D NGUI事件 UIEvents UIEvents-事件系统void OnH ...

  10. BlogEngine.Net

    BlogEngine.Net架构与源代码分析系列part1:开篇介绍 2008-11-05 15:27 by GUO Xingwang, ...阅读, ...评论, 收藏, 编辑 最近我要开始这个系列 ...