目录
set集合
用来保存不重复的元素,即集合中的元素都是唯一的,互不相同。
set 集合是无序的,所以每次输出时元素的排序顺序可能都不相同。
Python 中有两种集合类型,一种是 set 类型的集合,另一种是 frozenset 类型的集合,它们唯一的区别是,set 类型集合可以做添加、删除元素的操作,而 forzenset 类型集合不行。
创建set集合
使用 {} 创建
setname = {element1,element2,...,elementn}
其中,setname 表示集合的名称,起名时既要符合 Python 命名规范,也要避免与 Python 内置函数重名。
不能添加列表、字典、集合这类可变的数据。
a = {1,'c',1,(1,2,3),'c'}
print(a)
运行结果为:
{1, 'c', (1, 2, 3)}
set()函数创建集合
set() 函数为 Python 的内置函数,其功能是将字符串、列表、元组、range 对象等可迭代对象转换成集合。该函数的语法格式如下:
setname = set(iteration)
其中,iteration 就表示字符串、列表、元组、range 对象等数据。
如果要创建空集合,只能使用 set() 函数实现。因为直接使用一对 {},Python 解释器会将其视为一个空字典。
str = [123,"123",'1']
set1 = set(str)
print(type(set1))
print(set1)
str = "abcdefgh"
print(set(str))
str1 = [123,"123",'1',[456,'789']]
print(set(str1))
结果:
TypeError: unhashable type: 'list'
<class 'set'>
{'1', 123, '123'}
{'h', 'g', 'a', 'd', 'e', 'b', 'c', 'f'}
Traceback (most recent call last):
File "D:/PycharmProjects/pythonProject/main.py", line 11, in <module>
print(set(str1))
TypeError: unhashable type: 'list'
访问set集合元素
由于集合中的元素是无序的,因此无法向列表那样使用下标访问元素。Python 中,访问集合元素最常用的方法是使用循环结构,将集合中的数据逐一读取出来。
a = {1,'c',1,(1,2,3),'c'}
for ele in a:
print(ele,end=' ')
运行结果为:
1 c (1, 2, 3)
删除set集合
a = {1,'c',1,(1,2,3),'c'}
del(a)
set集合基本操作
向 set 集合中添加元素
setname.add(element)
其中,setname 表示要添加元素的集合,element 表示要添加的元素内容。
使用 add() 方法添加的元素,只能是数字、字符串、元组或者布尔类型(True 和 False)值,不能添加列表、字典、集合这类可变的数据,否则 Python 解释器会报 TypeError 错误。
a = {1,2,3}
a.add((1,2))
print(a)
a.add([1,2])
print(a)
运行结果为:
{(1, 2), 1, 2, 3}
Traceback (most recent call last):
File "C:\Users\mengma\Desktop\1.py", line 4, in <module>
a.add([1,2])
TypeError: unhashable type: 'list'
集合中删除元素
删除现有 set 集合中的指定元素,可以使用 remove() 方法,该方法的语法格式如下:
setname.remove(element)
使用此方法删除集合中元素,需要注意的是,如果被删除元素本就不包含在集合中,则此方法会抛出 KeyError 错误
a = {1,2,3}
a.remove(1)
print(a)
a.remove(1)
print(a)
运行结果为:
{2, 3}
Traceback (most recent call last):
File "C:\Users\mengma\Desktop\1.py", line 4, in <module>
a.remove(1)
KeyError: 1
如果我们不想在删除失败时令解释器提示 KeyError 错误,还可以使用 discard() 方法,此方法和 remove() 方法的用法完全相同,唯一的区别就是,当删除集合中元素失败时,此方法不会抛出任何错误。
setname.discard(element)
a = {1,2,3}
a.remove(1)
print(a)
a.discard(1)
print(a)
运行结果为:
{2, 3}
{2, 3}
集合做交集、并集、差集运算
有 2 个集合,分别为 set1={1,2,3} 和 set2={3,4,5},它们既有相同的元素,也有不同的元素。以这两个集合为例,分别做不同运算的结果如表 1 所示。
集合方法(全)
frozenset集合(set集合的不可变版本)
set 集合是可变序列,程序可以改变序列中的元素;frozenset 集合是不可变序列,程序不能改变序列中的元素。set 集合中所有能改变集合本身的方法,比如 remove()、discard()、add() 等,frozenset 都不支持;set 集合中不改变集合本身的方法,fronzenset 都支持。
frozenset 集合的这些方法和 set 集合中同名方法的功能是一样的。
两种情况下可以使用 fronzenset:
- 当集合的元素不需要改变时,我们可以使用 fronzenset 替代 set,这样更加安全。
- 有时候程序要求必须是不可变对象,这个时候也要使用 fronzenset 替代 set。比如,字典(dict)的键(key)就要求是不可变对象。
s = {'Python', 'C', 'C++'}
fs = frozenset(['Java', 'Shell'])
s_sub = {'PHP', 'C#'}
#向set集合中添加frozenset
s.add(fs)
print('s =', s)
#向为set集合添加子set集合
s.add(s_sub)
print('s =', s)
运行结果:
s = {'Python', frozenset({'Java', 'Shell'}), 'C', 'C++'}
Traceback (most recent call last):
File "C:\Users\mozhiyan\Desktop\demo.py", line 11, in <module>
s.add(s_sub)
TypeError: unhashable type: 'set'
字典和集合
people = [(178,120,19),(177,140,30),(164,100,18)]
def find_people_info(people,aim_height):
info=""
for height,weight,age in people:
if height == aim_height:
info = str(height)+' '+str(weight)+' '+str(age)
return info
return None
print('The people of height 177 info {}'.format(find_people_info(people,177)))
结果:
The people of height 177 info 177 140 30