Python学习---Python下[set集合]的学习
Posted 小a玖拾柒
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python学习---Python下[set集合]的学习相关的知识,希望对你有一定的参考价值。
Set集合[可变]是一个无序的,不重复的数据组合,它的主要作用如下:
1. 去重,把一个列表变成集合,就自动去重了
2. 关系测试,测试两组数据之前的交集、差集、并集等关系
集合(set):把不同的元素组成一起形成集合,是python基本的数据类型。
集合分类:可变集合、不可变集合
可变集合(set):可添加和删除元素,非可哈希的[但是要求自己的元素是可Hash的],不能用作字典的键,也不能做其他集合的元素
不可变集合(frozenset):与上面恰恰相反
创建结合:
利用set()/ frozenset()创建,且元素必须是不可变的,利用大括号{}输出包装
# 错误的创建 s = set(\'a\', 1, \'b\') print(s) # TypeError: set expected at most 1 arguments, got 3 li = [1, 2, \'a\', \'b\'] s = set(li) # 列表变为集合 print(s) # {1, 2, \'a\', \'b\'} li2 = [1, 2, 1, \'a\', \'a\'] s = set(li2) print(s) # 去重后: {1, 2, \'a\'} li = [[1, 2,], \'a\', \'b\'] s = set(li) # 报错,TypeError: unhashable type: \'list\' # set s1 = set(\'hello\') print(s1) # {\'h\', \'l\', \'o\', \'e\'} # frozenset s2 = frozenset(\'hhh\') print(s2) # frozenset({\'h\'})
访问集合
由于集合本身是无序的,所以不能为集合创建索引或切片操作,只能循环遍历或使用in、not in来访问或判断集合元素。
s1 = set(\'hello world\') print(\'a\' in s1) # True print(\'b\' in s1) # False # s1[1] #TypeError: \'set\' object does not support indexing # 循环迭代无序输出 for i in s1: print(i, end=\'\\t\') # e w o r d l h # 直接输出 print(s1) # {\'h\', \'w\', \'r\', \'l\', \'o\', \'d\', \'e\', \' \'} 输入里面有空格,输出也有空格
更新集合
s.add() :元素作为一个整体添加进去
s.update(): 必须添加的是一个序列,列表[可以理解为添加,但是是一个字符一个字符序列化的添加]
s.remove():删除掉某一个元素
s.pop():删除任何一个元素,因为set集合是无序的,删除的随机性
s.clear(): 清空set里面的值
del set(): 删除set集合
s1 = set(\'apple\') print("原始set集合 :", s1) s1.add(\'samsung\') print("add后的set : ", s1) s1.update(\'huawei\') print("update后的set:", s1) s1.remove(\'a\') # 因为添加的是序列后的单个字符,所以不能直接输入 print("remove后的set:", s1) s1.pop() print("pop后的set :", s1) s1.clear() print("clear后的set :", s1) del s1 # print("del后的set :", s1) # 报错 NameError: name \'s1\' is not defined
集合类型操作符
1 in ,not in
2 集合等价与不等价(==, !=)
3 子集、超集4 联合(|)操作与集合的or操作其实等价的,联合符号有个等价的方法,union()
子集和超集: 父集必须多于子集和一个字符
S1是S0的父集合: s1.issuperset(s0) ==> s1 > s0
S0是S1的子集合: s0.issubset(s1) ==> s0 < s1
s1 = set(\'applesamsung\') s0 = set(\'apple\') print("原始set集合[s0] :", s0) print("原始set集合[s1] :", s1) print(\'s1是s0的父集合 :\', s1 > s0) # 父集必须多于子集和一个字符 print(\'s1是s0的issuperset:\', s1.issuperset(s0)) # 父集必须多于子集和一个字符 print(\'s0是s1的父集合 :\', s0 < s1) # 父集必须多于子集和一个字符 print(\'s0是s1的issubset :\', s0.issubset(s1)) # 父集必须多于子集和一个字符
交集: s0.intersection(s1) ==> s0 & s1
并集: s0.union(s1) ==> s0 | s1
差集: s0.difference(s1) ==> s0 - s1 【以S0为基础进行对比,in s0 not in s1】
对称差集: s0.symmetric_difference(s1) ==> s0 ^ s1
s0 = set([1, 2, 3, 4, 5]) s1 = set([4, 5, 6, 7, 8]) print("原始set:s0:", s0) print("原始set:s1:", s1) print("【交集】and :", s0.intersection(s1)) # 取出交集 print("【交集】s0&s1:", s0&s1) # 取出交集 print("【并集】 :", s0.union(s1)) # 取出并集 print("【并集】s0|s1:",s0 | s1) # 取出并集 print("【S0差集】 :", s0.difference(s1)) # 以S0为主, in S0 not in S1 print("【差集】s0-s1:", s0-s1) # 以S0为主, in S0 not in S1 print("【S1差集】 :", s1.difference(s0)) # 以S1为主, in S1 not in S0 print("【差集】s1-s0:", s1-s0) # 以S0为主, in S0 not in S1 print("【对称差集】 :", s1.symmetric_difference(s0)) # 除了公共的元素以外的元素 print("【对称差集】s0 ^s1:", s1 ^ s0 ) # 除了公共的元素以外的元素
set集合应用:最简单的去重
\'\'\'最简单的去重方式\'\'\' lis = [1,2,3,4,1,2,3,4] print list(set(lis)) #[1, 2, 3, 4]
以上是关于Python学习---Python下[set集合]的学习的主要内容,如果未能解决你的问题,请参考以下文章