彻底搞懂Python集合

Kamiisa ·
更新时间:2024-11-10
· 989 次阅读

文章目录一、集合简介二、集合对象的创建和删除三、集合操作与运算(一)集合元素增加与删除:(二)集合运算:四、序列解包五、Python集合应用案例 一、集合简介 集合(set)属于Python无序可变序列,使用一对大括号作为定界符,元素之间使用逗号分隔,同一个集合内的每个元素都是唯一的,元素之间不允许重复。 集合中只能包含数字、字符串、元组等不可变类型(或者说可哈希)的数据,而不能包含列表、字典、集合等可变类型的数据。 二、集合对象的创建和删除 直接将集合赋值给变量即可创建一个集合对象。 >>> a = {3, 5} #创建集合对象 使用函数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() #空集合 三、集合操作与运算 (一)集合元素增加与删除:

增加:

add()方法可以增加新元素,如果该元素已存在则忽略该操作,不会抛出异常; update()方法用于合并另外一个集合中的元素到当前集合中,并自动去除重复元素。 >>> s = {1, 2, 3} >>> s.add(3) #添加元素,重复元素自动忽略 >>> s {1, 2, 3} >>> s.update({3,4}) #更新当前字典,自动忽略重复的元素 >>> s {1, 2, 3, 4}

删除:

pop()方法用于随机删除并返回集合中的一个元素,如果集合为空则抛出异常; remove()方法用于删除集合中的元素,如果指定元素不存在则抛出异常; discard()方法用于从集合中删除一个特定元素,如果元素不在集合中则忽略该操作; clear()方法清空集合删除所有元素。 >>> s.discard(5) #删除元素,不存在则忽略该操作 >>> s {1, 2, 3, 4} >>> s.remove(5) #删除元素,不存在就抛出异常 KeyError: 5 >>> s.pop() #删除并返回一个元素 1 (二)集合运算: >>> 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) #对称差集 {0, 1, 2, 3, 7, 9, 10, 11, 12, 13} >>> a_set ^ b_set {0, 1, 2, 3, 7, 9, 10, 11, 12, 13} >>> x = {1, 2, 3} >>> y = {1, 2, 5} >>> z = {1, 2, 3, 4} >>> x >> x >> y >> {1, 2, 3} <= {1, 2, 3} #子集 True 四、序列解包 可以使用序列解包功能对多个变量同时进行赋值。(左右变量的个数必须相等,否则抛出异常) >>> x, y, z = 1, 2, 3 #多个变量同时赋值 >>> v_tuple = (False, 3.5, 'exp') >>> (x, y, z) = v_tuple >>> x, y, z = v_tuple >>> x, y = y, x #交换两个变量的值 >>> x, y, z = range(3) #可以对range对象进行序列解包 >>> x, y, z = iter([1, 2, 3]) #使用迭代器对象进行序列解包 >>> x, y, z = map(str, range(3)) #使用可迭代的map对象进行序列解包 >>>> a = [1, 2, 3] >>> b, c, d = a #列表也支持序列解包的用法 >>> x, y, z = sorted([1, 3, 2]) #sorted()函数返回排序后的列表 >>> s = {'a':1, 'b':2, 'c':3} >>> b, c, d = s.items() #这是Python 3.5之前的版本执行结果,Python 3.6之后的版本略有不同 >>> b ('c', 3) #顺序不确定 >>> b, c, d = s #使用字典时不用太多考虑元素的顺序 >>> b 'c' >>> b, c, d = s.values() >>> print(b, c, d) 1 3 2 >>> a, b, c = 'ABC' #字符串也支持序列解包 >>> print(a, b, c) A B C 使用序列解包可以很方便地同时遍历多个序列。 >>> keys = ['a', 'b', 'c', 'd'] >>> values = [1, 2, 3, 4] >>> for k, v in zip(keys, values): print(k, v) a 1 b 2 c 3 d 4 对内置函数enumerate()返回的迭代对象进行遍历: >>> 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 a The value on position 1 is b The value on position 2 is c 使用序列解包遍历字典元素: >>> s = {'a':1, 'b':2, 'c':3} >>> for k, v in s.items(): #字典中每个元素包含“键”和“值”两部分 print(k, v) a 1 c 3 b 2 五、Python集合应用案例

1.使用集合快速提取序列中单一元素,即提取出序列中所有不重复元素。如果使用传统方式的话,需要编写下面的代码:

>>> import random #生成100个介于0到9999之间的随机数 >>> listRandom = [random.choice(range(10000)) for i in range(100)] >>> newSet = set(listRandom) >>> print(newSet)

2.返回指定范围内一定数量的不重复数字。

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 data = randomNumbers(10, 1, 100) print(data)
作者:若年封尘



python集合 Python

需要 登录 后方可回复, 如果你还没有账号请 注册新账号