>>> 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)