python集合(set)

前言

我们前面深入了解了 字典 ,列表和元组,对这三个数据类型有了认识,今天我们了解下另外一种数据类型:集合。集合用来保存不重复的元素,即集合中的元素都是唯一的,元素只能是不可变的数据类型(包括整形、浮点型、字符串、元组),无法存储可变的数据类型(列表、字典、集合)。

集合

定义概念

   集合是一个无序集合,没有重复元素。基本用途包括成员测试和消除重复的条目。集合对象还支持数学运算,如并集、交集、差集和对等差分

创建集合

1-使用 {} 创建

set_name = {1, 1.2, "字符串", (1,2)}
print("set_name:", set_name)

# 输出
# set_name: {'字符串', 1, (1, 2), 1.2}

2- set()函数创建集合

set_name1 = set("帅气的读者")
set_name2 = set([1, 2])
set_name3 = set((1, 2))
print("set_name1:", set_name1)
print("set_name2:", set_name2)
print("set_name3:", set_name3)

# 输出结果
# set_name1: {'读', '者', '的', '气', '帅'}
# set_name2: {1, 2}
# set_name3: {1, 2}

访问元素

set_name = set("帅气的读者")
for index, item in enumerate(set_name):
    print(index, item)

# 返回结果
# 0 气
# 1 读
# 2 者
# 3 的
# 4 帅

从上面的返回结果可以看出,集合是无序的

删除元素

remove

set_name = set("帅气的读者")
set_name.remove("的")
for index, item in enumerate(set_name):
    print(index, item)
set_name.remove("的")

# 返回结果
# 0 帅
# 1 气
# 2 者
# 3 读
# Traceback (most recent call last):
# File "/Users/linjian/MonitorCenter/MonitorCenter/apps/t6.py", line 5, in <module>
#    set_name.remove("的")
# KeyError: '的'

删除集合中元素,需要注意的是,如果被删除元素本就不包含在集合中,则此方法会抛出 KeyError 错误

discard

set_name = set("帅气的读者")
set_name.remove("的")
for index, item in enumerate(set_name):
    print(index, item)
set_name.discard("的")

# 返回结果
# 0 读
# 1 帅
# 2 者
# 3 气

和 remove() 方法的用法完全相同,唯一的区别就是,当删除集合中元素失败时,此方法不会抛出任何错误。

clear:清空 set1 集合中所有元素    

set_name = set("帅气的读者")
set_name.clear()
print("set_name:", set_name)

# 返回结果
# set_name: set()

 pop: 随机删除元素

set_name = set("帅气的读者")
set_name.pop()
print("set_name:", set_name)

# 返回结果
# set_name: {'者', '帅', '气', '读'}

添加元素

add

set_name = set("帅气的读者")
set_name.add("们")
for index, item in enumerate(set_name):
    print(index, item)

# 返回结果
# 0 气
# 1 帅
# 2 们
# 3 的
# 4 者
# 5 读

add() 方法添加的元素,只能是数字、字符串、元组或者布尔类型(True 和 False)值,不能添加列表、字典、集合这类可变的数据,否则报错

update

set_name = set("帅气的读者")
set_name.update("1")
for index, item in enumerate(set_name):
    print(index, item)


# 返回结果
# 0 帅
# 1 者
# 2 读
# 3 1
# 4 的
# 5 气

其他方法

copy: 拷贝一个集合(浅拷贝)

set_name = set("帅气的读者")
set_copy = set_name.copy()
print("set_name:", set_copy)

# 返回结果
# set_name: {'读', '气', '帅', '者', '的'}
difference: 返回集合的差集,即返回的集合元素包含在第一个集合中,但不包含在第二个集合(方法的参数)中
set_a = {"python", "java", "go"}
set_b = {"duck", "fish", "python"}

print(set_a.difference(set_b))
print(set_a - set_b)

# 返回结果
# {'go', 'java'}
# {'go', 'java'}

 difference_update: 移除两个集合中都存在的元素

set_a = {"python", "java", "go"}
set_b = {"duck", "fish", "python"}

set_a.difference_update(set_b)
print("set_a:", set_a)

# 返回结果
# set_a: {'go', 'java'}

 intersection: 返回两个或更多集合中都包含的元素,即交集

set_a = {"python", "java", "go"}
set_b = {"duck", "fish", "python"}

print(set_a.intersection(set_b))
print(set_a & set_b)

# 返回结果
# {'python'}
# {'python'}

intersection_update:获取两个或更多集合中都重叠的元素,即计算交集

set_a = {"python", "java", "go"}
set_b = {"duck", "fish", "python"}

set_a.intersection_update(set_b)
print("set_a:", set_a)

# 返回结果
# set_a: {'python'}

isdisjoint :判断两个集合是否包含相同的元素,如果没有返回 True,否则返回 False。

set_a = {"python", "java", "go"}
set_b = {"duck", "fish", "python"}

print(set_a.isdisjoint(set_b))

# 返回结果
# False

issubset 判断集合的所有元素是否都包含在指定集合中,如果是则返回 True,否则返回 False

set_a = {"python", "java", "go"}
set_b = {"duck", "fish", "python"}

print(set_a.issubset(set_b))

# 返回结果
# False

issuperset 判断指定集合的所有元素是否都包含在原始的集合中,如果是则返回 True,否则返回 False

set_a = {"python", "java", "go"}
set_b = {"duck", "fish", "python"}

print(set_a.issuperset(set_b))

# 返回结果
# False

 symmetric_difference: 返回两个集合中不重复的元素集合,即会移除两个集合中都存在的元素

set_a = {"python", "java", "go"}
set_b = {"duck", "fish", "python"}

print(set_a.issuperset(set_b))
print(set_a ^ set_b)

# 返回结果
# {'go', 'java', 'duck', 'fish'}
# {'go', 'java', 'duck', 'fish'}

 symmetric_difference_update: 移除当前集合中在另外一个指定集合相同的元素,并将另外一个指定集合中不同的元素插入到当前集合中。

set_a = {"python", "java", "go"}
set_b = {"duck", "fish", "python"}

set_a.symmetric_difference_update(set_b)
print(set_a)


# 返回结果
#{'go', 'fish', 'java', 'duck'}

union: 返回两个集合的并集,即包含了所有集合的元素,重复的元素只会出现一次。

set_a = {"python", "java", "go"}
set_b = {"duck", "fish", "python"}

print(set_a.union(set_b))


# 返回结果
# {'python', 'java', 'duck', 'go', 'fish'}

集合和字典的区别

python字典和集合都是有哈希表实现的,两者区别就在于,对于字典而言,这张表存储了哈希值(hash)、键和值这 3 个元素,而对集合来说,哈希表内只存储单一的元素。具体的实现原理可以查看详解python-----字典

集合和字典的性能测试

首先这个测试来源于网上,我觉得还不错就分享过来

# 统计时间需要用到 time 模块中的函数,了解即可
import time


def find_unique_price_using_list(products):
    unique_price_list = []
    for _, price in products:  # A
        if price not in unique_price_list:  # B
            unique_price_list.append(price)
    return len(unique_price_list)


id = [x for x in range(0, 100000)]
price = [x for x in range(200000, 300000)]
products = list(zip(id, price))

# 计算列表版本的时间
start_using_list = time.perf_counter()
find_unique_price_using_list(products)
end_using_list = time.perf_counter()
print("time elapse using list: {}".format(end_using_list - start_using_list))


# 使用集合完成同样的工作
def find_unique_price_using_set(products):
    unique_price_set = set()
    for _, price in products:
        unique_price_set.add(price)
    return len(unique_price_set)


# 计算集合版本的时间
start_using_set = time.perf_counter()
find_unique_price_using_set(products)
end_using_set = time.perf_counter()
print("time elapse using set: {}".format(end_using_set - start_using_set))

返回结果

time elapse using list: 43.95403001100203
time elapse using set: 0.009717649998492561

可以发现,仅仅十万的数据量,两者的速度差异就如此之大 ,大家想想如果数据量在大一点呢?

 

 学习链接

python中的字典和集合

set是如何实现的

list和set的区别

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木子林_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值