python学习之路☞15.data structure set.md

python学习之路☞15.数据结构 set

#python, #data_structure, #set, #union, #intersection, #difference, #dedup,
set 代码练习

'''
集合:
    由花括号内的的元素无序且不重复,并用逗号分隔的一种数据结构
    常用于去重和关系运算。
元素:任意类型
    特点:
        无序:
            集合中的元素没有特定的顺序。
        唯一:
            集合中的每个元素都是唯一的,没有重复。
创建:
    非空集合:
        使用 {} 括号创建一个包含元素的集合。
    空集合:
        使用 set() 内置函数创建一个空集合。

    ```python
    # 创建空集合
    empty_set = set()

    # 创建非空集合
    fruits = {"apple", "banana", "cherry"}
    ```

基本操作
    增:
        使用 add() 方法向集合添加单个元素。
    删:
        使用 remove() 方法删除指定元素,元素不存在时引发 KeyError 。
        使用 discard() 方法删除指定元素,元素不存在时不引发错误 。
        使用 pop() 方法随机删除并返回一个元素。
    检查元素:
        使用 in 运算符检查元素是否在集合中。
    集合长度:
        使用 len() 函数获取集合中元素的个数。

    ```python
    # 创建集合
    fruits = {"apple", "banana", "cherry"}

    # 添加元素
    fruits.add("orange")
    print(fruits)  # 输出:{'orange', 'banana', 'apple', 'cherry'}

    # 删除元素
    fruits.remove("banana")
    print(fruits)  # 输出:{'orange', 'apple', 'cherry'}

    # 检查元素
    print("apple" in fruits)  # 输出:True

    # 集合长度
    print(len(fruits))  # 输出:3
    ```

集合的常用方法
    add(item):
        向集合中添加一个元素。
    remove(item):
        从集合中移除一个元素,如果元素不存在会引发 KeyError 。
    discard(item):
        从集合中移除一个元素,如果元素不存在不会引发错误。
    pop():
        随机移除并返回一个元素。
    clear():
        清空集合中的所有元素。
    copy():
        返回集合的浅复制。
        浅复制是指创建一个新的集合对象,其中包含与原始集合相同的元素,
        但是新集合和原集合是独立的,即它们在内存中有不同的地址。
        这种性质和列表的切片很像

    ```python
    fruits = {"apple", "banana", "cherry"}

    # add
    fruits.add("orange")
    print(fruits)  # 输出:{'orange', 'banana', 'apple', 'cherry'}

    # discard
    fruits.discard("banana")
    print(fruits)  # 输出:{'orange', 'apple', 'cherry'}

    # pop
    removed_item = fruits.pop()
    print(removed_item)  # 输出:随机移除的元素
    print(fruits)  # 输出:剩余元素

    # clear
    fruits.clear()
    print(fruits)  # 输出:set()
    ```

实例应用
    集合运算
        并集:
            使用 union() 方法或 | 运算符获取两个集合的并集。
        交集:
            使用 intersection() 方法或 & 运算符获取两个集合的交集。
        差集:
            使用 difference() 方法或 - 运算符获取两个集合的差集。
        对称差集:
            使用 symmetric_difference() 方法或 ^ 运算符获取两个集合的对称差集。

    ```python
    set1 = {"apple", "banana", "cherry"}
    set2 = {"banana", "cherry", "date"}

    # 并集
    union_set = set1.union(set2)
    print(union_set)  # 输出:{'banana', 'apple', 'cherry', 'date'}

    # 交集
    intersection_set = set1.intersection(set2)
    print(intersection_set)  # 输出:{'banana', 'cherry'}

    # 差集
    difference_set = set1.difference(set2)
    print(difference_set)  # 输出:{'apple'}

    # 对称差集
    symmetric_difference_set = set1.symmetric_difference(set2)
    print(symmetric_difference_set)  # 输出:{'apple', 'date'}
    ```

    去重:集合可以用于从列表中去除重复项。
    ```python
    items = ["apple", "banana", "apple", "cherry", "banana"]
    unique_items = list(set(items))
    print(unique_items)  # 输出:['apple', 'banana', 'cherry']
    ```

    集合推导式:集合推导式提供了一种简洁的语法来创建集合。
    ```python
    # 生成包含从0到9的平方数的集合
    squares = {x ** 2 for x in range(10)}
    print(squares)  # 输出:{0, 1, 4, 9, 16, 25, 36, 49, 64, 81}
    ```
'''

# 创建集合
print('---------创建集合-----------')
make_set = set()  # set() 内置函数创建 集合
print(make_set, type(make_set))
"""
这里会发现,True不会被打印出来
在 Python 中,布尔类型的 True 和整数 1 被认为是相等的。
在集合中,由于元素的唯一性,当添加 1 后,再添加 True 时,集合会忽略 True
"""
make_set = {1, 1.9, True, '你好世界'}  # {elements} 创建
print(make_set, type(make_set))

# 操作 set 集合
# 增
print('---------增加元素-----------')
make_set.add('你好')
make_set.add(1.99)
make_set.add(False)
make_set.add(2)
print(make_set, type(make_set))
# 删
print('---------删除元素-----------')
make_set.remove(1)
print(make_set, type(make_set))
make_set.discard('你好世界')
print(make_set, type(make_set))
print('删除', make_set.pop(), '元素,', make_set, type(make_set))
# 检查元素
print('---------检查元素-----------')
print(' 你好世界 在集合里吗?', '你好世界' in make_set)

# 获取长度
print('---------获取长度-----------')
print('长度:', len(make_set))

# 复制集合
print('---------复制集合-----------')
copy_set = make_set.copy()
print(copy_set, type(copy_set))

# 清空集合
print('---------清空集合-----------')
make_set.clear()
print(make_set, type(make_set))

# 集合运算
print('---------集合运算 并-----------')
make_set_0 = {1, 2, 3, 5, 7, 9}
make_set_1 = {1, 2, 4, 6, 8, 10}
print('集合0:', make_set_0)
print('集合1:', make_set_1)
print('并集运算结果:', make_set_0.union(make_set_1))
print('---------集合运算 交-----------')
print('交集运算结果:', make_set_0.intersection(make_set_1))
"""
这里就能看出来,差集运算是第一个集合与第二个集合比较
将第一个集合种不同的元素拿出来
"""
print('---------集合运算 差-----------')
print('差集运算结果集合0种的不同元素:', make_set_0.difference(make_set_1))
print('差集运算结果集合1种的不同元素:', make_set_1.difference(make_set_0))
"""
这里就能看出来,对称差集运算是第一个集合与第二个集合比较
将两个集合中共有的部分剔除然后合并
"""
print('---------集合运算 对称差-----------')
print('对称差集运算结果:', make_set_0.symmetric_difference(make_set_1))

# 列表去重
"""
利用set元素唯一的特性可以为列表这种带有索引有序的元素去重
"""
make_list = [1, 2, 1, 3, 4, 5, 6]
print(make_list, '去重结果:', list(set(make_list)))  # 列表转化为集合再将集合转化为列表

# 集合推导式创建 0x3~4x3
"""
i * 3 for i in range(5)
这个推导式的过程可以看作是以下的结构
for i in range(5):
    i*3
"""
result_set = {i * 3 for i in range(5)}
print(result_set)

参考

Sets — Python 3 docs
Python Set — python.land

Comments