彻底搞懂Python集合

一、集合简介

  • 集合(set)属于Python无序可变序列,使用一对大括号作为定界符,元素之间使用逗号分隔,同一个集合内的每个元素都是唯一的,元素之间不允许重复。
  • 集合中只能包含数字、字符串、元组等不可变类型(或者说可哈希)的数据,而不能包含列表、字典、集合等可变类型的数据。

二、集合对象的创建和删除

  1. 直接将集合赋值给变量即可创建一个集合对象。
>>> a = {3, 5}                         #创建集合对象
  1. 使用函数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()                                     #空集合

三、集合操作与运算

(一)集合元素增加与删除:

增加:

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

删除:

  1. pop()方法用于随机删除并返回集合中的一个元素,如果集合为空则抛出异常;
  2. remove()方法用于删除集合中的元素,如果指定元素不存在则抛出异常;
  3. discard()方法用于从集合中删除一个特定元素,如果元素不在集合中则忽略该操作;
  4. 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 < y                             #比较集合大小/包含关系
False
>>> x < z                             #真子集
True
>>> y < z
False
>>> {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)

发布了103 篇原创文章 · 获赞 260 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/zag666/article/details/104947621