set集合和list集合的区别_Python进阶10_set集合

ee1994a63f8a86df9ba54a018bbf6216.png

不可变映射类型

标准库里所有的映射类型都是可变的,从 Python 3.3 开始,types 模块中引入了一个封装类名叫 MappingProxyType。

只需要给它一个映射,它会返回一个只读的映射类型。 但是如果修改了原有的映射,其也会动态跟着一起被修改。 自己不被修改,原形被修改了,自己跟着一起被改。 coding 实例如下

from types import MappingProxyType
d = {'公众号':'瓦力人工智能'}
d_proxy = MappingProxyType(d)

print(d)
print(d_proxy)
print(d_proxy['公众号'])

# 这里会报错:'mappingproxy' object
# does not support item assignment
# 无法添加和修改映射
# d_proxy['知乎号'] = "瓦力人工智能"
# d_proxy['公众号'] = "瓦力人工智能2"

# 通过d来修改是可行,也就是d_proxy可以捕捉
# d的任何消息,所以d_proxy是动态的
d['知乎号'] = "瓦力人工智能"
print(d)
print(d_proxy)
{'公众号': '瓦力人工智能'}
{'公众号': '瓦力人工智能'}
瓦力人工智能
{'知乎号': '瓦力人工智能', '公众号': '瓦力人工智能'}
{'知乎号': '瓦力人工智能', '公众号': '瓦力人工智能'}

集合论

集合的概念

什么是集合?这是一个数学概念,在数学分析中第一章就会详细介绍各种集合。在这里我们只需要理解其一个本质就好了:许多唯一对象的聚集

根据这点,可以利用集合来去重,具体coding 如下。 集合中的元素必须是可散列。但是set本身是不可散列。

集合运算符

  • 并集: 两个集合 a 和 b,a | b 返回的是它们的合集
  • 交集: a & b 得到的是交集
  • 差集: a - b 得到的是差集

灵活利用集合的这些运算的好处:
- 提高 Python 程序的运行时间 - 让代码的行数变少,省去不必要的循环和逻辑操作 - 更容易判断程序的正确性

l = ['瓦力','瓦力人工智能','瓦力','瓦力人工智能']
myset = set(l)
print(l)
print(myset)
['瓦力', '瓦力人工智能', '瓦力', '瓦力人工智能']
{'瓦力', '瓦力人工智能'}
# 判断程序集needles 的元素在 haystack 里出现的次数
found = len(needles & haystack)

# 以上代码等价于
found = 0
for n in needles:
    if n in haystack:
        found +=1

# 如果不是集合又可以如下做
found = len(set(needles) & set(haystack))

#或者这样写
found = len(set(needles).intersection(haystack))

集合字面量

集合的定义:s = {1,2,3},如果是空集,需要写成set()的形式s={} python会认其建立一个空字典类型。

当然也可以通过列表来定义集合例如:s =set(l) 这样做的话也是可以的,而且很多场合都是这样用的,但是这里有一个技术细节。 直接定义比通过使用set([1,2,3])要更快更容易阅读,具体如下反汇编的代码。

s = {1}
print(type(s))
s2 = {}
print(type(s2))
# 如果建立set后,即使后面的操作让其变为空集
# python依然知道其为集合类型
s.pop()
print(type(s))

# 利用list来定义集合
l = [i for i in range(10)]
print(l)
s3 = set(l)
print(s3)
<class 'set'>
<class 'dict'>
<class 'set'>
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
# 利用反汇编来查看两种不同的
# 集合定义方式
from dis import dis

dis('{1}')
print("-----------------------")
dis('set[1]')
1           0 LOAD_CONST               0 (1)
              2 BUILD_SET                1
              4 RETURN_VALUE
-----------------------
  1           0 LOAD_NAME                0 (set)
              2 LOAD_CONST               0 (1)
              4 BINARY_SUBSCR
              6 RETURN_VALUE

集合推导

具体的格式如下:就是再大括号里加入推导的语法。 { i for i in range(1,100)}

# 新建一个 Latin-1 字符集合,该集合里的每个
# 字符的 Unicode 名字里都有“SIGN”这个单词
from unicodedata import name
{chr(i) for i in range(32,256) if 'SIGN' in name(chr(i),'')}
{'#',
 '$',
 '%',
 '+',
 '<',
 '=',
 '>',
 '¢',
 '£',
 '¤',
 '¥',
 '§',
 '©',
 '¬',
 '®',
 '°',
 '±',
 'µ',
 '¶',
 '×',
 '÷'}

集合的操作

可变和不可变集合所拥有的方法UML类图。

5e4417049d40eee17d227a4497b8f3a8.png

集合的数学运算

abadc9571b777d2abcb92a6174addd71.png

集合的比较运算

b3ee60843e7ae74202a746cc8dd019be.png

集合类型的其他方法

e0f4eac34dbb9bcddf034ff04665d781.png

分享关于人工智能,机器学习,深度学习以及计算机视觉的好文章,同时自己对于这个领域学习心得笔记。想要一起深入学习人工智能的小伙伴一起结伴学习吧!扫码上车!

9814e448c60ff0ba00760a8729b71388.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值