赞
踩
集合(set
),一种可变、无序、不重复的数据结构,由大括号{}
内、用逗号分隔的一组元素组成。
集合的元素是可变的,即,它支持元素的引用的直接修改,并有相应的操作函数。
与同为组合的序列不同,集合的元素是无序的。这意味着元素的顺序与其添加的顺序无关,并且元素也不再支持索引访问。
集合的访问仅可通过组合的通用操作进行,如:for
循环遍历、成员运算。(见第三篇和第七篇)
集合的元素是不重复的,也就是说,集合可自动对内部的元素进行去重处理。
与序列同理,集合同样有赋值创建和引用创建,对应类似的函数set()
。此外,类似于列表生成式(见第六篇),还支持集合生成(推导)式。
# 直接创建
set_ = {1, 2, 3}
print(set_) # {1, 2, 3}
# 引用创建
set_ = set([1, 2, 3])
print(set_) # {1, 2, 3}
# 空集
set_ = set()
print(set_) # set()
# 集合生成式
set_ = {i**2 for i in range(10) if i%2 == 0}
print(set_) # {0, 64, 4, 36, 16}
集合通过哈希表来实现存储,即使用散列函数将元素映射到表中的位置。
元素的地址会通过哈希函数计算得到一个定长数字,该数字称为哈希值或散列值。而哈希表是一种根据键的哈希值直接访问存储位置的数据结构,也称为散列表。
不同元素的哈希值可能相同,这就是哈希冲突。当发生冲突时,系统将元素添加到哈希桶的尾部,使其成为链表的节点。
集合的元素不会重复,是因为哈希表的结构会使得相同元素的会映射到同一地址。
add(element)
:添加一个元素。update(iterable)
:添加一个组合内的元素。set_ = set()
# 单个添加
set_.add('num')
print(set_) # {'num'}
# 多个添加
set_.update(range(5))
print(set_) # {0, 1, 2, 3, 4, 'num'}
后三个函数同样适用于列表的元素删除,语法格式与集合相似,但缺失索引后,其功能范围有所变化。
其中,pop()
的 “任意” 是与哈希值有关的伪随机机制。
set_ = set(range(5)) # {0, 1, 2, 3, 4}
# 定向删除
set_.discard(0)
print(set_) # {1, 2, 3, 4}
set_.remove(1)
print(set_) # {2, 3, 4}
# 不定向删除
set_.pop()
print(set_) # {3, 4}
# 清空
set_.clear()
print(set_) # set()
set1.intersection(set2)
:交运算,对应运算符&
,即set1 & set2
set1.union(set2)
:并运算,对应运算符|
,即set1 | set2
set1.difference(set2)
:差运算,对应运算符-
,即set1 - set2
set1.symmetric_difference(set2)
:对称差运算其中,并运算可用于元素的添加,区别在于:集合的运算返回的是一个新的集合。
set1 = {'c', 'a', 't'} set2 = {'h', 'a', 't'} # 取交 print(set1.intersection(set2)) # {'t', 'a'} print(set1 & set2) # 取并 print(set1.union(set2)) # {'t', 'c', 'h', 'a'} print(set1 | set2) # 取差:从 set1 中去掉 set1&set2 的元素 print(set1.difference(set2)) # {'c'} print(set1 - set2) # 对称取差:从 set1|set2 中去掉 set1&set2 的元素 print(set1.symmetric_difference(set2)) # {'c', 'h'} print((set1 | set2) - (set1 & set2)) # 地址更改 print(id(set1)) # 2357217208448 print(id(set2)) # 2357217209344 print(id(set1.union(set2))) # 2357217208672
set1.isdisjoint(set2)
:判断两集是否存在相同元素set1.issubset(set2)
:判断set1
是否为set2
的子集set1.issuperset(set2)
:判断set1
是否为set2
的超集以上函数的返回值类型为布尔。
set1 = set('apple')
set2 = set('app')
# 无共同元素为真
print(set1.isdisjoint(set2)) # False
# set2 Ↄ set1 为真
print(set1.issubset(set2)) # False
# set1 Ↄ set2 为真
print(set1.issuperset(set2)) # True
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。