python学习笔记(7)——集合(set)
关键词#1.定义:无序不重复元素集, 基本功能包括关系测试和消除重复元素.
2.关键词:类似dict、只有key无value、常用于集合类数学运算、
3.创建
s=set() #入参可以是list、tuple、str、甚至dict
示例:
>>> s=set([1,2,3])
>>> s
{1, 2, 3}
>>> s=set((1,2,3))
>>> s
{1, 2, 3}
>>> s=set('123')
>>> s
{'3', '2', '1'}
>>> s=set({'a':1,'b':2,'c':3})
>>> s
{'a', 'b', 'c'}
PS.
>>> s={} #此方法py默认建立dict,而不是set
>>> type(s)
<class 'dict'>
4.集合添加、删除
添加=两种常用方法,分别是add和update。
add
>>> s=set('abc')
>>> s
{'a', 'b', 'c'}
>>> s.add('python') #add方法:是把要传入的元素做为一个整个添加到集合中,入参限定每次一个
>>> s
{'python', 'a', 'b', 'c'}
update(1):拆分添加
>>> s=set('abc')
>>> s.update('python') #update方法:是把要传入的元素拆分,做为个体传入到集合中
>>> s
{'h', 'n', 'y', 't', 'b', 'o', 'p', 'a', 'c'}
update(2):合并set
>>> set_1={1,2}
>>> set_2={'a','b'}
>>> set_3={'python','c#'}
>>> set_1.update(set_2,set_3)
>>> set_1
{1, 2, 'b', 'python', 'c#', 'a'}
常见错误
>>> s=set([1,2,3])
>>> s
{1, 2, 3}
>>> s.add([4,5])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> #报错原因分析:在创建set时,入参可以是iterable,但创建完毕后,set内部元素的type是key,key不能是可变类型,如list,谨记!
>>> s=set('abc')
>>> s
{'a', 'b', 'c'}
>>> s.update('de')
>>> s
{'d', 'a', 'b', 'e', 'c'}
>>> s.update(('f','g'))
>>> s
{'a', 'g', 'e', 'd', 'b', 'f', 'c'}
>>> s.update([1,2,3])
>>> s #update入参规则同add,因为它会打散入参格式,所以只需审查入参最小单位=非可变 即可.
{'a', 'g', 1, 2, 3, 'e', 'd', 'b', 'f', 'c'}
>>> s.update([1,2,[4,5]]) #此处入参最小单位除int类1,2外还有一个[4,5]是list类型,所以报错.
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
#set、dict类内部结构使用hash算法,遇到不可用hash算法类型入参即报错(unhashable)如list.
list/tuple/dict类均试验通过,唯独str解释不了,待查
>>> s=set([1,2])
>>> s
{1, 2}
>>> s.update('3,a,[4,5]')
>>> s
{1, 2, 'a', '4', '5', '[', '3', ']', ','}
#貌似update对入参type是str时,将其内部一切视为元素并打散,把[、]、逗号都认成元素.而当入参type是list、tuple却不会。
删除=s.discard(),s.pop(),s.remove() #del不支持set
>>> s={'Python','Java','C','C++','JavaScript','C#','Ruby','PHP','Objective-C'}
>>> s.remove('Java')
>>> s.remove('hello') # remove() 入参不存在则报错
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
>>> s.discard('hello') #discard()入参不存在也不报错
>>>
>>> s.pop() #pop()禁入参,随机删除并返回元素
'Ruby'
>>> s
{'C#', 'C++', 'Objective-C', 'PHP', 'C', 'Python', 'JavaScript'}
s.clear()清空set
>>> s
{'C#', 'C++', 'Objective-C', 'PHP', 'C', 'Python', 'JavaScript'}
>>> s.clear()
>>> s
set()
copy、issubset等等set函数用help(set.xx)查询语法规则,用dir(set)查询函数
5.set作为数学应用的函数&操作符方法
1.测试单个元素在集合内是否存在: inornot in
>>> s={1,2,3,4,5,'a','b','m','n'}
>>> 1 in s
True
>>> 7 in s
False
>>> 'c' not in s
True
2.测试两个集合是否包含,子集操作:``issubset/issuperset
issubset=测试目标set是否包含于入参
>>> s1={2,3}
>>> s2={1,2,3,4,5}
>>> s1.issubset(s2)
True
>>> s2.issubset(s1)
False
issuperset=测试目标set是否包含入参
>>> s1={1,2,3,4,5}
>>> s2={2,3}
>>> s1.issuperset(s2)
True
3.合并两个set并返回其并集set: set.union()
>>> s1={1,2,3,4,5}
>>> s2={2,3,7}
>>> s1.union(s2)
{1, 2, 3, 4, 5, 7} #set为无序无重复集合,自动摒除重复元素
>>> s3=s1.union(s2)
>>> s3
{1, 2, 3, 4, 5, 7}
________________________________
操作符求并集:s1|s2
>>> s=s1|s2
>>> s
{1, 3, 4, 5, 6, 7}
4.交集:intersection()
>>> s1={1,3,4,5,7}
>>> s2={3,4,6}
>>> s1.intersection(s2)
{3, 4}
______________________________
操作符求交集:s1&s2
>>> s1&s2
{3, 4}
5.其他:difference() 相当于'差集'运算符
>>> s1={1,2,3,4,5}
>>> s2={2,4,6,8}
>>> s1.difference(s2) #s1中异于s2的元素集合
{1, 3, 5}
______________________________
#difference()=s1-s2 (差集操作符):相当于s1中减去s1&s2
>>> s1-s2
{1, 5, 7}
symmetric_difference():对称差集
>>> s1={1,2,3,4,5}
>>> s2={2,4,6,8}
>>> s1.symmetric_difference(s2)
{1, 3, 5, 6, 8}
_____________________________
操作符:s1^s2 #对称差集,相当于s1|s2-s1&s2
>>> s1^s2
{1, 3, 5, 6, 8}
| 目标 | 函数 | 操作符 | 解释 |
|---|---|---|---|
| x ⊆ y | x.issubset(y) | ||
| x ⊇ y | x.issuperset(y) | ||
| 并集∪ | x.union(y) | x|y | |
| 交集∩ | x.intersection(y) | x&y | |
| 差集 | x.difference(y) | x-y | x-x&y |
| 对称差集 | x.symmentric_difference(y) | x^y | x|y-x&y |
6.set遍历
#基本遍历法同list
s={1, 2, 'd', 'a', '4', 'c', '5'}
for i in s:
print(i)
______________________________
#idx表示集合中元素i的索引
s={1, 2, 'd', 'a', '4', 'c', '5'}
for idx, i in enumerate(s):
print(idx,i)
7. frozenset([iterable]) 冻结集合(元素不可变)
#区别于set,frozenset无法用s={}创建
>>> frozenset(['a','b','c'])
frozenset({'a', 'b', 'c'})
PS.关于set的几个陷阱
1.数学应用时的左右数比较结果'格式':set | ^ & frozenset
#当左右set类型不一致,结果格式以‘左’为准
>>> s={1,2,3,4,5,6}
>>> f=frozenset([1,3,5])
>>> s|f
{1, 2, 3, 4, 5, 6}
>>> s&f
{1, 3, 5}
>>> s^f
{2, 4, 6} #几个运算符的结果全为set
#同样的运算过程,结果'格式'完全不同
>>> f|s
frozenset({1, 2, 3, 4, 5, 6})
>>> f&s
frozenset({1, 3, 5})
>>> f^s
frozenset({2, 4, 6})
python学习笔记(7)——集合(set)的更多相关文章
- python学习笔记整理——集合 set
python学习整理笔记--集合 set 集合的用途:成员测试和消除重复的条目,进行集合运算 注意:花括号或set()函数可以用于创建集合. 注意:若要创建一个空的集合你必须使用set(),不能用{} ...
- Python学习笔记-Day3-set集合操作
set集合,是一个无序且不重复的元素集合.定义方式类似字典使用{}创建 目前我们学过的数据类型: 1.字符串(str),2.整型(int),3.浮点型(float),4,列表(list) 5.元组(t ...
- Python学习笔记7—集合
set 拥有类似 dict 的特点:可以用{}花括号来定义:其中的元素没有序列,也就是是非序列类型的数据;而且,set 中的元素不可重复,这就类似 dict 的键. >>> s1 = ...
- 【Python学习笔记】集合
概述 集合的一般操作 内建函数进行标准操作集合 数学运算符进行标准操作集合 集合的应用 概述 python的集合(set)是无序不重复元素集,是一种容器.集合(set)中的元素必须是不可变对象,即可用 ...
- python学习笔记(集合的使用)
集合 集合(set):把不同的元素组成一起形成集合,是python基本的数据类型. 集合元素(set elements):组成集合的成员 为什么需要集合? 集合的作用 1 .列表去重复数据 按照现有知 ...
- python学习笔记之集合
集合:可变的数据类型,他里面的元素必须是不可变的数据类型,无序,不重复. {}'''# set1 = set({1,2,3})# set2 = {1,2,3,[2,3],{'name':'alex'} ...
- python学习笔记_集合的定义和常用方法
1.认识集合 定义: s={1,2,3,4,5} s=set("hello") s=set(["steven","job","da ...
- python学习笔记(六)-集合
集合是一个无序不重复元素的集.基本功能包括关系测试和消除重复元素.集合对象还支持union(联合),intersection(交),difference(差)和sysmmetric differenc ...
- python学习笔记整理——字典
python学习笔记整理 数据结构--字典 无序的 {键:值} 对集合 用于查询的方法 len(d) Return the number of items in the dictionary d. 返 ...
随机推荐
- 009 NAT
static nat r1(config)#ip nat inside source static 192.168.1.2 10.0.0.2 r1(config)#int f0/0 r1(config ...
- 程序员之---C语言细节18(一些奇怪表达式)
主要内容:一些奇怪表达式 #include <stdio.h> #define N 10 int main() { int a = 1; int *q = &a; int p = ...
- windows安装Python模块:requests
个人在windows10安装python模块requests如下过程: 1.下载requests模块:首先打开powershell, cd到你要下载文件的位置(我的是d:\softwareinstal ...
- restlet 2.3.5 org.restlet包导入eclipse出现的com.sun.net.httpserver类包找不到问题
准备过一遍restlet 2.3.5 JavaEE的源码. 环境 eclipse3.7.2 和 jdk 7.0 将org.restlet 包增加到eclipse中.出现 com.sun.net.htt ...
- 2013:Audio Tag Classification - MIREX Wiki
Contents [hide] 1 Description 1.1 Task specific mailing list 2 Data 2.1 MajorMiner Tag Dataset 2.2 M ...
- Glide 图片形状裁剪 ,滤镜等
Glide . Picasso . Fresco 已逐渐成为Android主流的图片加载工具(个人见解,使用Volley.ImageLoader.xUtils的大佬们请勿喷~),在多数Android程 ...
- [NOI 2014] 起床困难综合征
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=3668 [算法] 从高位向低位贪心即可 时间复杂度 : O(30N) [代码] #in ...
- 34.无废话ExtJs 入门教程十八[树:TreePanel]
转自:https://www.cnblogs.com/iamlilinfeng/archive/2012/06/28/2566350.html 1. <!DOCTYPE html PUBLIC ...
- 【WIP_S4】栈
创建: 2018/01/15 更新: 2018/01/24 更改标题 [[WIP_S3]堆] => [[WIP_S4]堆] 继续添加内容 更新: 2018/05/13 更改标题 [[WIP_S ...
- bzoj 1651: [Usaco2006 Feb]Stall Reservations 专用牛棚【贪心+堆||差分】
这个题方法还挺多的,不过洛谷上要输出方案所以用堆最方便 先按起始时间从小到大排序. 我用的是greater重定义优先队列(小根堆).用pair存牛棚用完时间(first)和牛棚编号(second),每 ...