Python学习日记-集合

本章目录

  • Part One:基本概念
  • Part Two:常用方法
  • Part Three:不可变集合

基本概念

集合Set的原理和字典比较类似,也是一组key的集合,但是没有value,所以从实现上看起来又和列表类似。
Set具有字典的大部分特性,比如Set也是无序的,不能保证元素的添加顺序,只能存入不可变元素等。另外,Set最重要的一个特性就是它的元素是唯一的,如果存在两个同样的元素的时候,Python只会保存其中的一个。

  1. 集合初始化
# 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'}
  1. 空集合
set_temp = set()
print(type(set_temp))
# set方法只有一种空集合创建方式就是set方法
# {}只会创建字典dict
empty = {}
print(type(empty))

结果为:

<class 'set'>
<class 'dict'>
  1. 集合操作
    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'}

常用方法

  1. add方法添加元素
tarena_train = set(["Java", "Android", "Python"])
# add方法向集合添加元素,可以添加不同类型的元素,但是必须是不可变的
tarena_train.add("C")
tarena_train.add(1)
print(tarena_train)

结果为:

{1, 'Android', 'Python', 'C', 'Java'}
  1. 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'}
  1. 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'}
  1. 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'}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 本节要介绍的是Python里面常用的几种数据结构。通常情况下,声明一个变量只保存一个值是远远不够的,我们需要将一组...
    小黑y99阅读 65,456评论 0 9
  • 一朋友说顺时针转动经筒,每转一次就是上天对世人的祝福。塔尔寺之行至今留给我印象深刻的就是这一排经筒,它像是随风而动...
    揽月府下提笔从戎阅读 2,600评论 0 0
  • 当我们老了还有多少没有拾起的稻穗那一粒粒饱满的日子是你名字的牵挂每天第一件事要做的黎明早起我们去集市慢步在街角到另...
    道一上人阅读 3,803评论 11 60
  • 晚霞映红了西方的天幕 像我的心不只一次地飞向你 很多时候我们放弃一些东西 致力于那些看上去应该做的事 我们以为丢弃...
    雪小凝阅读 1,810评论 2 1
  • ThinkPHP 3.2.3快速入门 【目录列表】简单一些大概内容如下: index.php文件的了解;调试模式;...
    __没几句话阅读 3,446评论 0 0

友情链接更多精彩内容