Python集合类型
来自CloudWiki
目录
集合类型概述
Python语言中的集合类型与数学中的集合概念一致,即包含0个或多个数据项的无序组合
集合是无序组合,用大括号({})表示,它没有 索引和位置的概念,集合中元素可以动态增加或 删除。
集合的元素不能重复。
集合常用操作
集合的创建
方法1:创建空集合
>>> x = set() >>> x set()
方法2:创建非空集合
- 直接将集合赋值给变量即可创建一个集合对象。
>>> a = {3, 5} #创建集合对象 >>> type(a) #查看对象类型 <class 'set'>
- 集合中元素不可重复,
- 元素类型只能是固定数据类型, 例如:整数、浮点数、字符串、元组等,
- 列表、字典和 集合类型本身都是可变数据类型,不能作为集合的元素出现。
>>> s = {1010,"1010",78.9} >>> type(s) <class 'set'> >>> len(s) 3 >>> print(s) {1010, '1010', 78.9} >>> s = {1010,[1,2,3]} Traceback (most recent call last): File "<pyshell#4>", line 1, in <module> s = {1010,[1,2,3]} TypeError: unhashable type: 'list'
方法3:转换为集合
- 也可以使用函数set()函数将列表、元组、字符串、range对象等其他可迭代对象转换为集合,如果原来的数据中存在重复元素,则在转换为集合的时候只保留一个;如果原序列或迭代对象中有不可哈希的值,无法转换成为集合,抛出异常。
>>> a_set = set(range(8, 14)) #把range对象转换为集合 >>> a_set {8, 9, 10, 11, 12, 13} >>> b_set = set([0, 1, 2, 3, 0, 1, 2, 3, 7, 8]) #转换时自动去掉重复元素 >>> b_set {0, 1, 2, 3, 7, 8} >>> x = set() #空集合
需要注意,由于集合元素是无序的,集合的打印效果与 定义顺序可以不一致。由于集合元素独一无二,使用集合类型能够过滤掉重复元素
>>>T = {1010, "1010", 12.3, 1010, 1010} >>>print(T)
练习:
下面代码的输出结果是
>>> s = {} >>> type(s)
A.<class 'dict'>
B.<class 'tuple'>
C.<class 'set'>
D.<class 'list'>
下面代码的输出结果是
>>> s = set() >>> type(s)
A.<class 'tuple'>
B.<class 'set'>
C.<class 'list'>
<D.class 'dict'>
集合运算
- 集合运算:
>>> a_set = set([8, 9, 10, 11, 12, 13]) >>> b_set = {0, 1, 2, 3, 7, 8} >>> a_set | b_set #并集 {0, 1, 2, 3, 7, 8, 9, 10, 11, 12, 13} >>> a_set.union(b_set) #并集 {0, 1, 2, 3, 7, 8, 9, 10, 11, 12, 13} >>> a_set & b_set #交集 {8} >>> a_set.intersection(b_set) #交集 {8} >>> a_set.difference(b_set) #差集 {9, 10, 11, 12, 13} >>> a_set - b_set {9, 10, 11, 12, 13} >>> a_set.symmetric_difference(b_set) #对称差集,大家观察:这里有8吗 ? {0, 1, 2, 3, 7, 9, 10, 11, 12, 13} >>> a_set ^ b_set {0, 1, 2, 3, 7, 9, 10, 11, 12, 13}
- 实例1:判断学生是否观看腾讯课堂
1. 学生总集合
2. 观看腾讯课堂学生集合
3. 没有观看腾讯课堂学生的集合
集合常用方法
>>> a= {1,2,3} >>> a.add(4)#增加元素 >>> a {1, 2, 3, 4} >>> a.remove(1)#删除元素 >>> a {2, 3, 4} >>> len(a)#集合长度 3 >>> 1 in a #判断是否包括 False >>> 1 not in a True >>> a.clear() #清空集合 >>> a set()
集合的不可重复性
- 集合类型主要用于元素去重,适合于任何组合数 据类型
>>> s = set('知之为知之,不知为不知') >>> s {'不', '知', '之', '为', ','} >>> for i in s: print(i,end=" ") 不 知 之 为
- 实例2:怎样判断网址是否重复爬取 ?
集合的应用:去重
- 问题解决:生成不重复的随机数。
解析:生成随机数容易,生成不重复的随机数难。
因此我们可以利用集合元素不允许重复的特点,把生成的随机数 放到集合当中。
不用集合时:
import random def randomNumbers(number,start,end): i = 0 while i< number: s = random.randint(start,end) print(s) i = i+1 if __name__ == '__main__': randomNumbers(8,1,10)
使用集合时:
import random def randomNumbers(number, start, end): '''使用集合来生成number个介于start和end之间的不重复随机数''' data = set() while len(data)<number: element = random.randint(start, end) data.add(element) return data
集合的应用:成员判断
- 问题解决:下面两段代码用来测试指定列表中是否包含非法数据,很明显第二段使用集合的代码更高效一些。
去除英文敏感词:
excludes = {"sex","love"} txt = "some people say , sex and love is not all of life" txt = txt.replace(","," ") words = txt.split(" ") print(words) '''解法1: for word in words: if word in excludes: print("该文章含有敏感词汇:",word) ''' #解法2 w=set(words) print("该文章含有敏感词汇:",w&excludes)
去除中文敏感词:
import jieba excludes = {"恐怖","恐怖主义"}#{"将军","却说","丞相"} txt = "中国政府将坚定的和恐怖主义做斗争" words = jieba.lcut(txt) print(words) ''' for word in words: if word in excludes: print("该文章含有敏感词汇:",word) ''' w=set(words) print("该文章含有敏感词汇:",w&excludes)