Python进阶10_集合set的使用

不可变映射类型

标准库里所有的映射类型都是可变的,从 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类图。

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

集合的数学运算

集合的数学运算

集合的比较运算

集合的比较运算

集合类型的其他方法

集合类型的其他方法


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

瓦力人工智能 - 扫码上车

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值