本章目录
- Part One:基本概念
- Part Two:常用方法
- Part Three:不可变集合
基本概念
集合Set的原理和字典比较类似,也是一组key的集合,但是没有value,所以从实现上看起来又和列表类似。
Set具有字典的大部分特性,比如Set也是无序的,不能保证元素的添加顺序,只能存入不可变元素等。另外,Set最重要的一个特性就是它的元素是唯一的,如果存在两个同样的元素的时候,Python只会保存其中的一个。
- 集合初始化
# set方法初始化集合
set_nba = set(["Miami Heat", "Cleveland Cavaliers", "Houston Rockets", "Golden State Warriors"])
print(set_nba)
# {}方式初始化集合
tarena_train = {"Java", "Android", "Python", "Android"}
# 打印结果可知,"Android"这个重复项只会保留一个
print(tarena_train)
结果为:
{'Golden State Warriors', 'Cleveland Cavaliers', 'Miami Heat', 'Houston Rockets'}
{'Python', 'Android', 'Java'}
- 空集合
set_temp = set()
print(type(set_temp))
# set方法只有一种空集合创建方式就是set方法
# {}只会创建字典dict
empty = {}
print(type(empty))
结果为:
- 集合操作
set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作:
set1 = set(["Java", "Android", "Python", "C"])
set2 = set(["C", "PHP", "IOS", "C#"])
# 两个集合的并操作,即返回两个集合的所有元素,并去掉重复的集合
print("两个集合的并操作(union方法),结果为:", set1.union(set2))
print("两个集合的并操作(|操作符),结果为:", set1 | set2)
print("=======================================华丽的分割线=======================================")
# 两个集合的交操作,即返回两个集合相同的元素组成的集合
print("两个集合的交操作(intersection方法),结果为:", set1.intersection(set2))
print("两个集合的交操作(&操作符),结果为:", set1 & set2)
print("=======================================华丽的分割线=======================================")
# 两个集合的差操作,返回只在第一个集合,而不在第二个结合的元素组成的集合
print("set1在前,set2在后的差操作(difference方法),结果为:", set1.difference(set2))
print("set2在前,set1在后的交操作(-操作符),结果为:", set2 - set1)
print("=======================================华丽的分割线=======================================")
# 两个集合的对称差操作, 返回不同时存在于两个集合中的元素组成的集合
print("两个集合的对称差操作(symmetric_difference方法),结果为:", set1.symmetric_difference(set2))
print("两个集合的对称差操作(^操作符),结果为:", set2 ^ set1)
结果为:
两个集合的并操作(union方法),结果为: {'IOS', 'Java', 'Python', 'Android', 'C#', 'PHP', 'C'}
两个集合的并操作(|操作符),结果为: {'IOS', 'Java', 'Python', 'Android', 'C#', 'PHP', 'C'}
=======================================华丽的分割线=======================================
两个集合的交操作(intersection方法),结果为: {'C'}
两个集合的交操作(&操作符),结果为: {'C'}
=======================================华丽的分割线=======================================
set1在前,set2在后的差操作(difference方法),结果为: {'Java', 'Python', 'Android'}
set2在前,set1在后的交操作(-操作符),结果为: {'PHP', 'IOS', 'C#'}
=======================================华丽的分割线=======================================
两个集合的对称差操作(symmetric_difference方法),结果为: {'IOS', 'Java', 'Python', 'Android', 'C#', 'PHP'}
两个集合的对称差操作(^操作符),结果为: {'IOS', 'Java', 'Python', 'Android', 'C#', 'PHP'}
常用方法
- add方法添加元素
tarena_train = set(["Java", "Android", "Python"])
# add方法向集合添加元素,可以添加不同类型的元素,但是必须是不可变的
tarena_train.add("C")
tarena_train.add(1)
print(tarena_train)
结果为:
{1, 'Android', 'Python', 'C', 'Java'}
- update方法添加多个元素
tarena_train = set(["Java", "Android", "Python"])
# update方法向集合添加元素,可以同时添加多个,并去重
tarena_train.update(["Java", "C#", "PHP"])
temp = {"Java", "C", ".net"}
tarena_train.update(temp)
print(tarena_train)
结果为:
{'C#', 'Python', 'Java', 'C', 'Android', 'PHP', '.net'}
- remove,pop和discard方法移除元素
tarena_train = set(["Java", "C", "Android", "Python"])
temp = set(["Android", "Java", "Python"])
# remove方法移除元素,无返回值,如果元素不存在会报错
print(tarena_train.remove("Java"))
# pop方法移除元素,返回值为该移除的元素
# 移除的位置是随机的,也就是说同样的代码每次执行结果可能不一样
# 如果集合为空,则会报错
print(tarena_train.pop())
# discard方法移除元素,无返回值,如果元素不存在不会报错
print(tarena_train.discard("Android"))
print(tarena_train)
结果为:
None
C
None
{'Python'}
- difference_update删除多个元素
tarena_train = set(["Java", "Android", "Python"])
tarena_train.update(["Java", "C#", "PHP"])
print(tarena_train)
# difference_update方法是从集合中删除相同的元素,多用于多个元素删除
tarena_train.difference_update(["Java", "C#", "PHP"])
print(tarena_train)
结果为:
{'C#', 'Java', 'Android', 'Python', 'PHP'}
{'Android', 'Python'}
不可变集合
类似于列表和元祖的关系,Python里也提供了一种不可变集合(frozen set)。
不可变集合的创建方式和集合差不多,不过一旦创建,不可改变,一般作为字典中的key。
# 不可变集合只有frozenset这一种创建方式
android_class = frozenset(["Java", "Android"])
c_class = frozenset(["C", "C++"])
dict_grade = dict([(android_class, "Excellent")])
dict_grade[c_class] = "Normal"
print(dict_grade)
结果为:
{frozenset({'Android', 'Java'}): 'Excellent', frozenset({'C', 'C++'}): 'Normal'}