Python基础

10.Python基础语法---06集合

2020-03-21  本文已影响0人  浪子大侠

集合

基本定义:通过{}构建

特性:无序,不可重复,元素可以是不同类型(不支持unhashable 类型的元素)

基础操作

  1. 集合运算
    1.1 |并集运算符:求两个集合并或合集
    1.2 &交集运算符:求两个集合交集
    1.3 -差集运算符:求两个集合差集

    s1 = {1, 2, 3, 4, 5, 6}
    s2 = {4, 5, 6, 7, 8, 9}
    print("s1: {}".format(s1))
    print("s2: {}".format(s2))
    # 并集
    s = s1 | s2
    print("s1|s2: {}".format(s))
    # 交集
    s = s1 & s2
    print("s1 & s2: {}".format(s))
    # 差集
    s = s1 - s2
    print("s1 - s2: {}".format(s))
    # 差集
    s = s2 - s1
    print("s2 - s1: {}".format(s))
    
    执行结果:
    s1: {1, 2, 3, 4, 5, 6}
    s2: {4, 5, 6, 7, 8, 9}
    s1|s2: {1, 2, 3, 4, 5, 6, 7, 8, 9}
    s1 & s2: {4, 5, 6}
    s1 - s2: {1, 2, 3}
    s2 - s1: {8, 9, 7}
    
    
  2. 集合操作
    集合只存在添加和删除两个操作,无所谓修改操作
    2.1 添加
    set.add(x)——将x添加到集合中
    2.2 删除
    set.remove(x)——从集合中移除元素 x。 如果 x 不存在于集合中则会引发 KeyError。
    set.discard(x)——如果元素 x 存在于集合中则将其移除。
    set.pop()——从集合中移除并返回任意一个元素。 如果集合为空则会引发 KeyError。任意代表随机吗?!
    set.clear()——清空集合

    # 添加
    s = {1,2,3,4,5}
    print("s:{}".format(s))
    s.add(6)
    print("s:{}".format(s))
    s.add(3)
    print("s:{}".format(s))
    
    print("*" * 23)
    
    # 删除
    # remove()
    s.remove(4)
    print("s:{}".format(s))
    
    # s.remove(4)
    # Traceback (most recent call last):
    #   File "XXXXXXX", line XXX, in     <module>
    #     s.remove(4)
    # KeyError: 4
    
    # discard()
    returntest = s.discard(5)
    print("returntest:{}".format(returntest))
    print("s:{}".format(s))
    s.discard(5) # 不抛异常
    
    # pop()
    s.pop()
    print("s:{}".format(s))
    s.pop()
    print("s:{}".format(s))
    s.pop()
    print("s:{}".format(s))
    s.pop()
    print("s:{}".format(s))
    # s.pop()
    # print("s:{}".format(s))
    # Traceback (most recent call last):
    #   File "d:/Dev/WorkSpace/01SunnyLearn/Python/Basic/SunnyPython/basic/02group.py", line 620, in <module>
    #     s.pop()
    # KeyError: 'pop from an empty set'
    
    # All Test
    hello = "Hello Python World! We Are Family"
    for char in hello:
        s.add(char)
    
    print("s:{}".format(s))
    spop = s.pop()
    print("spop:{}".format(spop))
    print("s:{}".format(s))
    spop = s.pop()
    print("spop:{}".format(spop))
    print("s:{}".format(s))
    spop = s.pop()
    print("spop:{}".format(spop))
    print("s:{}".format(s))
    
    s.clear()
    print("s:{}".format(s))
    
    执行结果:
    s:{1, 2, 3, 4, 5}
    s:{1, 2, 3, 4, 5, 6}
    s:{1, 2, 3, 4, 5, 6}
    ***********************
    s:{1, 2, 3, 5, 6}
    returntest:None
    s:{1, 2, 3, 6}
    s:{2, 3, 6}
    s:{3, 6}
    s:{6}
    s:set()
    s:{'r', 'A', 'd', 'n', 'H', 't', 'm', ' ', 'h', 'P', 'l', 'e', 'W', 'F', 'a', 'y', '!', 'i', 'o'}
    spop:A
    s:{'r', 'd', 'n', 'H', 't', 'm', ' ', 'h', 'P', 'l', 'e', 'W', 'F', 'a', 'y', '!', 'i', 'o'}
    spop:d
    s:{'r', 'n', 'H', 't', 'm', ' ', 'h', 'P', 'l', 'e', 'W', 'F', 'a', 'y', '!', 'i', 'o'}
    spop:n
    s:{'r', 'H', 't', 'm', ' ', 'h', 'P', 'l', 'e', 'W', 'F', 'a', 'y', '!', 'i', 'o'}
    s:set()
    
  3. 其他操作
    3.1 len() 集合大小
    3.2 in, not in 成员判断符

    s = "Hello Python World! We are Family!"
    print("s:{}".format(s))
    print("s字符串列表长度:{}".format(len(s)))
    
    t = set()
    for char in s:
       t.add(char)
    print("t:{}".format(t))
    print("t大小:{}".format(len(t)))
    
    print("{}".format("H" in t))
    print("{}".format("H" not in t))
    print("{}".format("U" in t ))
    print("{}".format("U" not in  t ))
    
    执行结果:
    s:Hello Python World! We are Family!
    s字符串列表长度:34
    t:{'r', 'm', 'i', 'H', 'y', 'W', '!', 'F', ' ', 'd', 'a', 'o', 'l', 'P', 'h', 'e', 'n', 't'}
    t大小:18
    True
    False
    False
    True
    

补充

QA

Q1:为什么集合不支持unhashable 类型的元素
A:
简单的可以理解为可哈希其实就是不可变,只有哈希不可变才能比较确认是否重复,才能实现集合的无重复特性哦!!!集合在内部需要使用哈希值来判断是否相等!!!

>>> hash(0)
0
>>> hash(23)
23
>>> hash(-23)
-23
>>> hash(23.24)
553402322211282967
>>> hash(-23.24)
-553402322211282967
>>> hash('23')
-4826980359952576689
>>> hash(23+24j)
24000095
>>> hash(23-24j)
-24000049
>>> hash(True)
1
>>> hash(False)
0
>>> hash(None)
124074573
>>> hash([1,2,3,4,5])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> hash({'key1':1, 'key2':2})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
>>> hash((1,2,3,4,5))
8315274433719620810
>>> hash((1,2,3,[4,5]))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> hash((1,2,3,(4,5)))
-325972594757234431
>>> hash({1,2,3})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'set'

Q2:set.pop()所谓任意的机制与原理
A: //TODO
https://stackoverflow.com/questions/21017188/set-pop-isnt-random

参考:
互联网相关资料

上一篇 下一篇

猜你喜欢

热点阅读