Python集合类型

来自CloudWiki
跳转至: 导航搜索

集合类型概述

Python语言中的集合类型与数学中的集合概念一致,即包含0个或多个数据项的无序组合

集合是无序组合,用大括号({})表示,它没有 索引和位置的概念,集合中元素可以动态增加或 删除。

集合的元素不能重复

Python21040601.png

集合常用操作

集合的创建

方法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'>

集合运算

Python2020-2-1.png

  • 集合运算:
>>> 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)