Python序列结构--集合

集合:元素之间不允许重复

  • 集合属于Python无序可变序列,元素之间不允许重复

集合对象的创建与删除

  • 直接将值赋值给变量即可创建一个集合

    >>> a = {3,5}>>> type(a)<class ‘set‘>
  • set()函数将列表、元组、字符串、range对象等其他可迭代对象转换为集合,如果原来的数据中存在重复元素,则转换为集合的时候只保留一个;如果原序列或迭代对象中有不可哈希的值,无法转换为集合,抛出异常
    >>> a_set=set(range(8,14))>>> 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.strip() for x in (‘he ‘,‘she  ‘,‘  I‘)}{‘I‘, ‘he‘, ‘she‘}>>> import random>>> x = {random.randint(1,500) for i in range(100)} #生成随机数,自动去除重复的元素>>> len(x)  # 一般而言输出结果会小于10094>>> {str(x) for x in range(10)}{‘1‘, ‘9‘, ‘4‘, ‘8‘, ‘3‘, ‘7‘, ‘2‘, ‘6‘, ‘0‘, ‘5‘}

集合的操作与运算

集合元素的增加和删除
  • add()方法可以增加新元素,如果该元素已存在则忽略该操作,不会抛出异常;update()方法合并另外一个集合中的元素到当前集合中,并且自动去除重复元素

    >>> s = {1,2,3}>>> s.add(3)        # 添加元素,重复元素自动忽略>>> s.update({3,4}) # 更新字典,自动忽略重复的元素>>> s{1, 2, 3, 4}
  • pop()方法随机删除并返回集合中的一个元素,如果为空则抛出异常;remove()方法删除集合中的元素,如果指定元素不存在则抛出异常;discard()方法从集合中删除一个特定的元素,如果元素不存在则忽略该操作;clear()方法清空集合
    >>> s{1, 2, 3, 4}>>> s.discard(5)        # 删除元素,不存在则忽略该操作>>> s.remove(5)         # 删除元素,不存在则抛出异常Traceback (most recent call last):  File "<stdin>", line 1, in <module>KeyError: 5>>> s.pop()     # 删除并返回元素1>>> s{2, 3, 4}>>> s.clear()>>> sset()
集合运算
  • 内置函数len()、max()、min()、sum()、sorted()、map()、filter()、enumerate()等也适用于集合。另外还支持数学意义上的交集、并集、差集等运算

    >>> a_set = set([8,9,10,11,12,113])>>> a_set{8, 9, 10, 11, 12, 113}>>> b_set = {0,1,2,3,7,8}>>> a_set | b_set       # 并集{0, 1, 2, 3, 7, 8, 9, 10, 11, 12, 113}>>> a_set.union(b_set)  # 并集{0, 1, 2, 3, 7, 8, 9, 10, 11, 12, 113}>>> a_set & b_set       # 交集{8}>>> a_set.intersection(b_set){8}>>> a_set.difference(b_set) # 差集{9, 10, 11, 12, 113}>>> b_set.difference(a_set){0, 1, 2, 3, 7}>>> a_set - b_set{9, 10, 11, 12, 113}>>> b_set - a_set{0, 1, 2, 3, 7}>>> a_set.symmetric_difference(b_set)   # 对称差集{0, 1, 2, 3, 7, 9, 10, 11, 12, 113}>>> a_set ^ b_set{0, 1, 2, 3, 7, 9, 10, 11, 12, 113}>>> x = {1,2,3}>>> y = {1,2,5}>>> z = {1,2,3,4}>>> x < y   # 比较集合大小/包含关系False>>> x < z   # 真子集True>>> y < zFalse>>> z < zFalse>>> z <= z  # 子集True>>> x.issubset(y) # 测试是否为子集False>>> x.issubset(z)True>>> x.issubset(x)True

不可变集合frozenset

用法与set基本类似,与set类不同的是,frozenset是不可变集合,没有提供add()、remove()等可以修改集合对象的方法
>>> x = frozenset(range(5))>>> xfrozenset({0, 1, 2, 3, 4})>>> x.add(2)Traceback (most recent call last):  File "<stdin>", line 1, in <module>AttributeError: ‘frozenset‘ object has no attribute ‘add‘>>> x | frozenset(range(5,10))      # 并集frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9})>>> x & frozenset(range(4,10))      # 交集frozenset({4})>>> x - frozenset(range(4,10))      # 差集frozenset({0, 1, 2, 3})>>> frozenset(range(4)) < frozenset(range(5))   # 集合包含关系比较True

集合应用案例

  • python字典和集合都使用hash表来存储元素,元素查询速度快,关键字in作用于字典和集合比作用于列表要快得多

    >>> import random>>> x1 = list(range(10000))>>> x2 = tuple(range(10000))>>> x3 = set(range(10000))>>> x4 = dict(zip(range(10000),range(10000)))>>> r = random.randint(0,9999)>>> for t in (x4, x3, x2, x1):...   start = time.time()...   for i in range(9999999):...     flag = (r in t)...   print(type(t),‘time used:‘, time.time() - start)...<class ‘dict‘> time used: 0.865715503692627<class ‘set‘> time used: 0.9040701389312744<class ‘tuple‘> time used: 487.52976393699646<class ‘list‘> time used: 488.0697581768036
  • 作为集合快速的具体应用,可以使用集合快速提取序列中单一元素,即提取序列中所有不重复的元素
    >>> import random>>> listRandom = [random.choice(range(1000)) for i in range(100)]>>> len(listRandom)100>>> newSet = set(listRandom)>>> len(newSet)95
  • 返回指定范围内一定数量的不重复数字
    >>> 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...>>> randomNumbers(10,1,1000){66, 676, 550, 522, 333, 783, 499, 278, 59, 349}
  • 返回指定范围内一定数量的不重复数字,使用random模块的sample()函数更好一些,但是random模块的sample()函数只支持列表、元组、集合、字符串和range对象,不支持字典以及map、zip、enumerate、filter等惰性求值的迭代对象
    >>> import random>>> random.sample(range(1, 700), 10)    # 选取指定分布中选取不重复元素[340, 489, 623, 121, 550, 632, 19, 531, 626, 591]
  • 下面两段代码用来测试指定列表中是否包含非法数据,很明显第二段用集合的代码效率高一些
    >>> import random>>> lstColor = (‘red‘,‘green‘,‘blue‘)>>> colors = [random.choice(lstColor) for i in range(10000)]>>> for item in colors:...   if item not in lstColor:...     print(‘error:‘,item)...     break...>>>>>> if (set(colors) - set(lstColor)):...   print(‘error‘)...>>>
  • 使用字典和集合模拟有向图结构,并实现了节点的入度和出度计算
    >>> def getDegress(orientedGraph,node):...   outDegree = len(orientedGraph.get(node,[]))...   inDegree = sum(1 for v in orientedGraph.values() if node in v)...   return (inDegree, outDegree)...>>> graph = {‘a‘ : set(‘bcdef‘), ‘b‘:set(‘ce‘), ‘c‘:set(‘d‘), ‘d‘: set(‘e‘), ‘e‘:set(‘f‘), ‘f‘:set(‘cgh‘),‘g‘:set(‘fhi‘), ‘h‘:set(‘fgi‘), ‘i‘:set() }>>> print(getDegress(graph, ‘h‘))(2, 3)>>>

序列解包的多种形式和用法

序列解包是Python中非常重要和常用的一个功能,可以使用非常简洁的形式完成复杂的功能,提高代码的可读性,减少了程序员代码的输入量
>>> x,y,z = 1,2,3>>> x1>>> y2>>> z3>>> v_tuple = (False,3.5,‘exp‘)>>> (x,y,z) = v_tuple>>> m,n,q = v_tuple>>> m,n,q = range(2)Traceback (most recent call last):  File "<stdin>", line 1, in <module>ValueError: not enough values to unpack (expected 3, got 2)>>> m,n,q = range(3)    # 对range对象进行序列解包>>> x,y,z = range(4)Traceback (most recent call last):  File "<stdin>", line 1, in <module>ValueError: too many values to unpack (expected 3)>>> x,y,z = iter([1,2,3])   # 使用迭代器对象进行序列解包>>> x,y,z = map(str,range(3))   # 使用可迭代的map对象进行序列解包>>> x‘0‘>>> y‘1‘>>> x,y =y,x    # 交换两个变量的值>>> x‘1‘>>> y‘0‘
序列解包还可用于列表、字典、enumerate对象、filter对象等,对字典使用时,默认是对字典“键”进行操作,如果对“键:值“对进行操作应使用字典的items()方法说明,如果需要对字典”值“进行操作应该使用字典的values()方法明确指定
>>> a = [1,2,3]>>> b,c,d = a>>> x,y,z = sorted([1,3,2])>>> s = {‘a‘:1,‘b‘:2,‘c‘:3}>>> b,c,d = s.items()>>> b(‘a‘, 1)>>> c(‘b‘, 2)>>> d(‘c‘, 3)>>> b,c,d = s>>> b‘a‘>>> c‘b‘>>> d‘c‘>>> b,c,d = s.values()>>> b1>>> c2>>> d3>>> a,b,c=‘ABC‘>>> a‘A‘>>> b‘B‘>>> c‘C‘
使用序列解包可以很方便地同时遍历多个序列
>>> keys = [‘a‘,‘b‘,‘c‘,‘d‘]>>> values = [1,2,3,4]>>> for k,v in zip(keys,values):...   print((k,v),end=‘ ‘)...(‘a‘, 1) (‘b‘, 2) (‘c‘, 3) (‘d‘, 4) >>>>>> x = [‘a‘,‘b‘,‘c‘]>>> for i,v in enumerate(x):...   print(‘The value on position {0} is {1}‘.format(i,v))...The value on position 0 is aThe value on position 1 is bThe value on position 2 is c>>> s = {‘a‘:1,‘b‘:2,‘c‘:3}>>> for k,v in s.items():...   print((k,v),end=‘ ‘)...(‘a‘, 1) (‘b‘, 2) (‘c‘, 3) >>>
序列解包的另类用法和错误的用法:
>>> print(*[1,2,3])1 2 3>>> print(*[1,2,3],4,*(5,6))1 2 3 4 5 6>>> *range(4),4(0, 1, 2, 3, 4)>>> *range(4)  File "<stdin>", line 1SyntaxError: can‘t use starred expression here>>> {*range(4),4,*(5,6,7)}{0, 1, 2, 3, 4, 5, 6, 7}>>> {‘x‘:1,**{‘y‘:2}}{‘x‘: 1, ‘y‘: 2}>>> a,b,c,d = range(3),3Traceback (most recent call last):  File "<stdin>", line 1, in <module>ValueError: not enough values to unpack (expected 4, got 2)>>> a,b,c,d = *range(3),3
下面的代码看起来与序列解包类型,但严格来说是序列解包的逆运算,与函数的可变长度参数一样,用来接收等号右侧的多个数值
>>> a,*b,c = 1,2,3,4,5>>> a1>>> b[2, 3, 4]>>> c5>>> a,b,c(1, [2, 3, 4], 5)>>> a,*b,c = range(20)>>> b[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]>>> *b = 1,2,4      # 等号左边必须为列表、元组或多个变量  File "<stdin>", line 1SyntaxError: starred assignment target must be in a list or tuple

原文地址:https://www.cnblogs.com/zxbdboke/p/10480215.html

时间: 2024-10-08 05:58:09

Python序列结构--集合的相关文章

Python序列结构--字典

字典:反映对应关系的映射类型 字典(dict)是包含若干“键:值”元素的无序可变序列 字典中元素的“键”可以是python中任意不可变数据,例如整数.实数.复数.字符串.元组等类型可哈希数据,“键”不允许重复,“值”是可以重复的.字典在内部维护的哈希表使得检索操作非常快. 字典创建与删除 使用“=” >>> aDict = {'server':'db.diveintopython3.org','database':'mysql'}>>> x = dict() # 创建空

Python字典、集合结构详解

目录 字典 导言 什么是字典 字典的主要特征 访问字典的值 创建空字典并添加键--值对 修改字典中的值 删除键--值对 遍历字典 遍历所有键--值对 遍历字典中的键 遍历字典中的值 通过映射函数创建字典 集合 导言 什么是集合 set()函数 计算集合元素个数 集合添加.删除元素 添加元素 删除元素 删除.清空集合 删除整个集合 清空集合 集合的交集.并集和差集运算 运算符进行运算 函数实现 参考资料: 例题讲解 四则运算(用字典实现 题目分析 代码实现 列表去重 题目分析: 代码实现 通过两个

简述Python语言的元组序列结构

序列是程序设计中经常用到的数据存储方式,几乎每一种程序设计语言都提供了表格数据结构,如C和Basic中的一维.多维数组等.Python语言提供的序列类型在所有程序设计语言中是最丰富,最灵活,也是功能最强大的. 序列是一系列连续值,它们通常是相关的,并且按一定顺序排列.Python中常用的序列结构有列表.元组等. 元组和列表类似,但属于不可变序列,元组一旦创建,用任何方法都不可以修改其元素. 元组的定义方式和列表相同,但定义时所有元素是放在一对圆括号"("和")"中,

Python序列应用知识回顾

Python序列应用 1.序列 序列是一块用于存放多个值的连续内存空间,并且按一定顺序排列.序列结构有列表.元组.集合.字典和字符串.Python对序列中列表.元组.字符串有索引.切片.相加和相乘操作,可以通过关键字in检查某个元素是否为序列的成员. (1)索引 序列中的每个元素都有一个编号被称为索引,通过索引可以访问序列中的任何元素.索引类似C语言数组中的下标从0开始表示第一个元素,依次递增,但索引可以为负数,例如:-1表示最后一个元素. (2)切片 切片是访问序列中元素的一种方法,可以访问一

14.python中的集合

什么是集合?正如其字面的意思,一堆东西集中合并到一起.乍一听貌似和容器没什么差别,嗯,好吧,集合也算是一种容器. 在学习这个容器有什么不同之前,先看看集合是如何创建的: a = set() #不可变集合 b = frozenset() #可变集合 print a print b 集合分为两种,一种是不可变的,一种是可变的,两者的差异后面会分析. 不过,我们创建了两个空的集合貌似么什么意思. 为了使其有意义,我们就先来看集合最重要的功能:去重. a = ('aaa',123,123,123) b

Python序列的切片操作与技巧

切片操作 对于具有序列结构的数据来说,切片操作的方法是:consequence[start_index: end_index: step]. start_index: 表示是第一个元素对象,正索引位置默认为0:负索引位置默认为 -len(consequence) end_index: 表示是最后一个元素对象,正索引位置默认为 len(consequence)-1:负索引位置默认为 -1. step: 表示取值的步长,默认为1,步长值不能为0. [注意]对于序列结构数据来说,索引和步长都具有正负两

Python的set集合详解

Python 还包含了一个数据类型 —— set (集合).集合是一个无序不重复元素的集.基本功能包括关系测试和消除重复元素.集合对象还支持 union(联合),intersection(交),difference(差)和 sysmmetric difference(对称差集)等数学运算. 创建集合set 大括号或 set() 函数可以用来创建集合. set集合类需要的参数必须是迭代器类型的,如:序列.字典等,然后转换成无序不重复的元素集.由于集合是不重复的,所以可以对字符串.列表.元组进行去重

Python中set集合的整理

set集合函数主要用来去除重复: 比如一个列表有多个重复值,可以用set搞掉 >>> l = [1,2,3,4,5,4,3,21] >>> >>> l [1, 2, 3, 4, 5, 4, 3, 21] >>> >>> >>> set(l) set([1, 2, 3, 4, 5, 21]) >>> set  可以做交集,并集,差集 set的增删改 增:>>> a

序列和集合算法之序列比较

将一个序列变成另一个序列的最少修改步数. 例如下图,将字符串A变成字符串B,所需要的步骤为6个步骤,match表示0步,其他操作表示1步: 设计算法如下: public sealed class MinimumEditDistance { public int[,] CalculateDistance(string originalStr, String targetStr) { int LenA = originalStr.Length; int LenB = targetStr.Length