15、集合

一、概要

set是一个无序且不重复的元素集合。

集合对象是一组无序排数据,集合成员可以做字典中的键。集合支持用in和not in操作符检查成员,由len()内建函数得到集合的基数(大小), 用 for 循环迭代集合的成员。但是因为集合本身是无序的,不可以为集合创建索引或执行切片(slice)操作,也没有键(keys)可用来获取集合中元素的值。set和dict一样,只是没有value,相当于dict的key集合,由于dict的key是不重复的,且key是不可变对象因此可以作为可以做字典中的键

主要用来做关系测试和消除重复元素

二、特点

  1. 不重复
  2. 元素为不可变对象
  3. 无序

三、创建

  1. 语法格式一
    s = {元素,元素,元素,元素}
    
  2. 语法格式二
    s = set(seq=())
    
  3. 注意事项
    • 在创建空集合的时候只能使用s=set(),因为s={}创建的是空字典
    • 如果传入的参数有重复,会自动忽略
    • 必须是可以迭代的对象 例如: 序列,元组
  4. 举个栗子
    s = {'k1', 'k2', 'k2', 1, 3.14}
    # 字符串对象转化成集合
    s = set('python')
    # 将列表转化成集合
    s = set(['y', 'b', 'o', 'o'])
    # 将字典转化成集合,注意只会包含键,不包含value
    s = set({"k1": 'v1', 'k2': 'v2'})
    # 将元组转化成集合
    s = {('k1', 'k2', 'k2')}
    
    #使用set()创建集合是注意
    # s = set(1)  # 错误
    # s = set(True) # 错误
    ```
    TypeError: 'int' object is not iterable
    ```
    

四、关系测试

4.1、说明

union(并集),intersection(交集),difference(差集)和sysmmetric difference(对称差集)等数学运算

4.2、并集(|)

  1. 说明
    数学概念: 给定两个集合A,B,把他们所有的元素合并在一起组成的集合,叫做集合A与集合B的并集,记作A∪B,读作A并B。
    去重后所有元素放一起
  2. 语法格式
    集合.union(集合)
    
    集合 | 集合 | 集合...
    
  3. 举个栗子
    s1 = {1, 2, 3, 4, 5}
    s2 = {4, 5, 6, 7, 8}
    print(s1.union(s2))
    s1 = {'a', 'b', 'c', 'd', 'python', 1}
    s2 = {1, 2, 'd', 'java'}
    print(s1.union(s2))
    

4.3、交集(&)

  1. 说明
    数学概念: 设AB是两个集合,由所有属于集合A属于集合B的元素所组成的集合,叫做集合A与集合B交集
    两者都存在的
  2. 语法格式
    集合.intersection(集合)
    
    集合 & 集合 & 集合 & 集合...
    
  3. 举个栗子
    s1 = {1, 2, 3, 4, 5}
    s2 = {4, 5, 6, 7, 8}
    print(s1.intersection(s2))
    s1 = {'a', 'b', 'c', 'd', 'python', 1}
    s2 = {1, 2, 'd', 'java'}
    print(s1.intersection(s2))
    

4.4、差集(-)

  1. 说明
    数学概念:以属于A而不属于B的元素为元素的集合成为A与B的差
    你有我没有
  2. 语法格式
    集合.difference(集合)
    
    集合 - 集合  - 集合 ...
    
  3. 举个栗子
    s1 = {1, 2, 3, 4, 5}
    s2 = {4, 5, 6, 7, 8}
    print(s1.difference(s2))
    # {1, 2, 3}
    s1 = {'a', 'b', 'c', 'd', 'python', 1}
    s2 = {1, 2, 'd', 'java'}
    print(s1.difference(s2))
    # {'b', 'python', 'c', 'a'}
    

4.5、对称差集(^)

  1. 说明
    数学概念:两个集合的对称差是只属于其中一个集合,而不属于另一个集合的元素组成的集合
    集合1和集合2都互相都没有(去重后放到一起)
  2. 语法格式
    集合.symmetric_difference(集合)
    
    集合 ^ 集合
    
  3. 举个栗子
    s1 = {1, 2, 3, 4, 5}
    s2 = {4, 5, 6, 7, 8}
    print(s1.symmetric_difference(s2))
    s1 = {'a', 'b', 'c', 'd', 'python', 1}
    s2 = {1, 2, 'd', 'java'}
    print(s1.symmetric_difference(s2))
    

4.6、子集(issubset)

  1. 说明
    数学概念:如果集合A任意一个元素都是集合B的元素,那么集合A称为集合B子集
    集合1是不是集合2的子集
  2. 语法格式
    集合1.issubset(集合2)
    
  3. 举个栗子
    s1 = {1, 2, 3, 4, 5, 6, 7, 8}
    s2 = {4, 5, 6, 7, 8}
    print(s2.issubset(s1))
    # True
    s1 = {1, 2, 3, 4, 5, 6, 7, 8}
    s2 = {4, 5, 6, 7, 8,9}
    print(s2.issubset(s1))
    # False
    

4.7、父集(issuperset)

  1. 说明
    集合1是不是集合2的父集
  2. 语法格式
    集合1.issuperset(集合2)
    
  3. 举个栗子
    s1 = {1, 2, 3, 4, 5, 6, 7, 8}
    s2 = {4, 5, 6, 7, 8}
    print(s1.issubset(s2))
    

4.8、是否存在交集

  1. 说明
    是否存在交集
  2. 语法格式
    集合1.isdisjoint(集合2)
    
  3. 举个栗子
    s1 = {1, 2, 3, 4, 5}
    s2 = {4, 5, 6, 7, 8}
    print(s1.isdisjoint(s2))
    # False
    s1 = {'a', 'b', 'c', 'python'}
    s2 = {1, 2, 'd', 'java'}
    print(s1.isdisjoint(s2))
    # True
    

五、其它方法

5.1、add

  1. 说明
    往set中添加一个元素只有set中不存在该元素时,才会加入该元素
  2. 语法格式
    set.add(元素)
    
  3. 参数说明
    • 要添加的元素,必须是不可变的
  4. 返回值
  5. 举个栗子
    s = {(1, 2, 3), '元素1', 1, True}
    s.add(2)
    # {'元素1', 2, 1, (1, 2, 3)}
    s = {(1, 2, 3), '元素1', 1, True}
    s.add(1)
    # {'元素1', 1, (1, 2, 3)}
    #注意元素是不可变的所以list不能作为元素
    s.add([1, 2])
    ```
    TypeError: unhashable type: 'list'
    ```
    

5.2、update

  1. 说明
    把新的元素添加到set中,把已有元素从set中删除。
  2. 语法格式
    set.update(s)
    
  3. 参数说明
    • 必须是可迭代的对象
      注意:传入的元素拆分,做为单个元素传入到集合中
  4. 返回
  5. 举个栗子
    s = set()
    # 将字符串中的每一个元素添加到集合中
    s.update('python')
    print(s)
    #讲列表中的每一个元素更新到集合中
    s.update([1, 2, 3, 4, 5])
    print(s)
    #把字典里的key更新到集合中
    s.update({1: 2, 'name': '小明'})
    print(s)
    #错误
    s.update(1)
    s.update(True)
    

5.3、pop

  1. 说明
    随机删除并返回set类型的集合中的一个不确定的元素,如果为空引发KeyError错误。
  2. 语法格式
    element = s.pop() 
    
  3. 参数说明:
  4. 返回值
    被删除的元素
  5. 举个栗子
    s = set([2, 3, 4, 5])
    ele = s.pop()
    

5.4、remove

  1. 说明
    删除指定元素
  2. 语法格式
    set.remove(ele)
    
  3. 参数说明
    • 要删除的元素
  4. 举个栗子
    s = {1, 'python', (1, 2, 3)}
    print(s)
    s.remove(1)
    print(s)
    

5.5、discard

  1. 说明
    如果存在则删除;如果没找到,则什么也不做
  2. 语法格式
    discard(element)
    
  3. 参数说明
    • 表示要查找并删除的元素
  4. 返回值
  5. 举个栗子
    set_list = set([1, 2, 3, 4, 5])
    set_list.discard(1)
    set_list.discard('python')
    print(set_list)
    

5.6、clear

  1. 说明
    清空s集合中的所有元素
  2. 语法格式
    set.clear()
    
  3. 参数说明
  4. 返回值
  5. 举个栗子
    s = set([1, 2, 3, 4, 5])
    s.clear()
    

5.7、copy

  1. 说明
    复制集合
  2. 语法格式
    set.copy()
    
  3. 参数说明
  4. 返回值
    一个新的集合
  5. 举个栗子
    s = set('123456')
    new_s = s.copy()
    

5.8、集合的范围判断

  1. 说明
    集合可以使用大于(>)、小于(<)、大于等于(>=)、小于等于(<=)、等于(==)、不等于(!=)来判断某个集合是否完全包含于另一个集合,也可以使用子父集判断函数。 也可以使用成员运算
  2. 举个栗子
    s1 = set([1, 2, 3, 4, 5])
    s2 = set([1, 2, 3, 4])
    s3 = set(['1', '8', '9', '5'])
    s1 > s2
    True
    s1 > s3
    False
    s1 >= s2
    True
    s2 < s1
    True
    s1 < s3
    False
    s3 < s1
    False
    s1 == s2
    False
    s2 == s3
    False
    s1 != s2
    True
    1 in s1
    True
    6 in s1
    False
    2 not in s1
    False
    6 not in s1
    True
    

六、集合推导

  1. 说明
    它们跟列表推导式也是类似的。 唯一的区别在于它使用大括号{}。
  2. 语法格式
    {表达式 for item in iterrator if 条件表达式}  
    
  3. 举个栗子
    # 重复的数据将会被忽略
    num = {x**2 for x in [100, 100, 30,50,60,50]}
    print(num)
    
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容