鱼C论坛

 找回密码
 立即注册
查看: 5979|回复: 16

[知识点备忘] 第040讲:集合(下)

[复制链接]
发表于 2021-11-10 23:41:31 | 显示全部楼层 |阅读模式
购买主题 已有 25 人购买  本主题需向作者支付 5 鱼币 才能浏览
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-6 10:28:33 | 显示全部楼层
集合分为可变集合与不可变集合。上节介绍的方法不会对集合内容进行改动,适用于所有集合;本节介绍的方法会对集合内容进行改动,故仅适用于可变集合。其中,add()方法是将传入的字符串整体作为一个元素插入集合中,与update()等方法迭代获取传入字符串中的每一个字符进行处理有所不同;remove()方法与discard()方法的区别在于当指定的元素不存在时,前者会抛出KeyError异常,后者则不会抛出异常。
后半节讲解了“可哈希”的概念,即某个对象的哈希值(可通过内置函数hash()来获取)在其整个程序的生命周期中保持不变。Python中大多数不可变对象都是可哈希的,而可变对象则是不可哈希的,这有点类似于Python对象的唯一标识值id,增量赋值后可变序列的id值不改变,不可变序列的id值会改变!字典的键和集合的元素都必须是可哈希的,故不能为可变对象;字典和集合本身是可变对象,不可哈希,故不可直接实现嵌套,但使用不可变集合却可以实现嵌套!
本节最后还讲了一个“奇技淫巧”——将列表转换成集合可以大幅提升程序的执行效率,因为集合的背后有散列表的支持,而列表则没有;换句话说,列表的每次查找都需要从头到尾地扫描,而集合则只需要简单的查表操作。以空间换时间,这也正是字典和集合高效背后的玄机!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2021-12-11 13:49:24 | 显示全部楼层
>>> ['frozenset()  对象是不可变的']
['frozenset()  对象是不可变的']
>>> t = frozenset('FishC')
>>> t
frozenset({'C', 'i', 's', 'F', 'h'})
>>> s = set('FishC')
>>> s
{'C', 'i', 's', 'F', 'h'}
>>> s.update([1,1],'23')
>>> s
{1, 'C', '3', 'i', '2', 's', 'F', 'h'}
>>> t.update([1,1],'23')
Traceback (most recent call last):
  File "<pyshell#7>", line 1, in <module>
    t.update([1,1],'23')
AttributeError: 'frozenset' object has no attribute 'update'
>>> s.intersection_update('FishC')
>>> s
{'C', 'i', 's', 'F', 'h'}
>>> s.difference_update('Php','Python')
>>> s
{'C', 'i', 's', 'F'}
>>> s.symmetric_difference_update('Python')
>>> s
{'t', 'C', 'P', 'h', 'i', 'n', 'y', 's', 'F', 'o'}
>>> ['上节课讲到的 没有update, 他们只是返回计算结果,而加上update 之后,是对集合进行更新']
['上节课讲到的 没有update, 他们只是返回计算结果,而加上update 之后,是对集合进行更新']
>>> ['s.update()  即是 s.unionupdate(),即是合并集合']
['s.update()  即是 s.unionupdate(),即是合并集合']
>>> s.add('45')
>>> s
{'t', 'C', '45', 'P', 'h', 'i', 'n', 'y', 's', 'F', 'o'}
>>> ['add() 方法与 update() 方法不同,前者是将整个字符串当作一个元素插入集合,而后者是将字符串 分开呈一个个元素后再插入集合']
['add() 方法与 update() 方法不同,前者是将整个字符串当作一个元素插入集合,而后者是将字符串 分开呈一个个元素后再插入集合']
>>> s.remove('晚买')
Traceback (most recent call last):
  File "<pyshell#19>", line 1, in <module>
    s.remove('晚买')
KeyError: '晚买'
>>> s.discard('晚买')
>>> s
{'t', 'C', '45', 'P', 'h', 'i', 'n', 'y', 's', 'F', 'o'}
>>> s.pop()
't'
>>> s.pop()
'C'
>>> s.pop()
'45'
>>> s.pop()
'P'
>>> s
{'h', 'i', 'n', 'y', 's', 'F', 'o'}
>>> s.clear()
>>> s
set()
>>> ['集合元素的删除,可以使用 remove() 方法和 discard() 方法,两者的区别是,如果要删除的元素原集合中没有,那么前者就会报错,而后者会静默处理; pop() 方法是随机剔除集合中的一个元素;  clear() 则是将一个集合变为一个空集合']
['集合元素的删除,可以使用 remove() 方法和 discard() 方法,两者的区别是,如果要删除的元素原集合中没有,那么前者就会报错,而后者会静默处理; pop() 方法是随机剔除集合中的一个元素;  clear() 则是将一个集合变为一个空集合']
>>> ['通过 hash() 函数可以获得一个对象的 哈希 值']
['通过 hash() 函数可以获得一个对象的 哈希 值']
>>> hash(1)
1
>>> hash(1.0)
1
>>> hash(1.001)
2305843009213441
>>> ['整数的 哈希 值是整数,两个相同值的  哈希 值是相同的']
['整数的 哈希 值是整数,两个相同值的  哈希 值是相同的']
>>> ['Python 中 大多不可变的对象都是 可哈希 的,而可变的对象都是 不可哈希 的,可哈希 就是其哈希值是不变的']
['Python 中 大多不可变的对象都是 可哈希 的,而可变的对象都是 不可哈希 的,可哈希 就是其哈希值是不变的']
>>> hash('FishC')
-5249203814098794668
>>> hash([1,2,3])
Traceback (most recent call last):
  File "<pyshell#37>", line 1, in <module>
    hash([1,2,3])
TypeError: unhashable type: 'list'
>>> ['如上所示:字符串是不可变的,其有哈希值,而列表是可变的,因此其没有哈希值']
['如上所示:字符串是不可变的,其有哈希值,而列表是可变的,因此其没有哈希值']
>>> hash((1,2,3))
529344067295497451
>>> {'Python':520,'FishC':1314}
{'Python': 520, 'FishC': 1314}
>>> {[1,2,3]:'FishC'}
Traceback (most recent call last):
  File "<pyshell#41>", line 1, in <module>
    {[1,2,3]:'FishC'}
TypeError: unhashable type: 'list'
>>> ['可哈希的对象才可以作为 键,因此上述不可哈希的列表不能作为字典的键']
['可哈希的对象才可以作为 键,因此上述不可哈希的列表不能作为字典的键']
>>> {'Python','FishC',520,1314}
{520, 1314, 'FishC', 'Python'}
>>> {'Python','FishC',520,1314,[1,2,3]}
Traceback (most recent call last):
  File "<pyshell#44>", line 1, in <module>
    {'Python','FishC',520,1314,[1,2,3]}
TypeError: unhashable type: 'list'
>>> x = {1,2,3}
>>> y = {x,4,5}
Traceback (most recent call last):
  File "<pyshell#46>", line 1, in <module>
    y = {x,4,5}
TypeError: unhashable type: 'set'
>>> ['上述嵌套集合中 x 是可变的,因此不能作为 键']
['上述嵌套集合中 x 是可变的,因此不能作为 键']
>>> x = frozenset(x)
>>> y = {x,4,5}
>>> y
{frozenset({1, 2, 3}), 4, 5}
>>> 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 1

使用道具 举报

发表于 2022-5-16 15:23:56 | 显示全部楼层
阿西吧什么时候我是一个成功过的人呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-17 09:38:34 | 显示全部楼层
打卡
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-29 20:06:13 | 显示全部楼层
小甲鱼真的很用心,谢谢你啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-1 10:34:02 | 显示全部楼层
卡打
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-1 15:07:04 | 显示全部楼层
已经迷糊了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-11 11:44:53 | 显示全部楼层
滴滴滴~打卡
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-6 18:08:00 | 显示全部楼层
Learning...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-29 14:28:17 | 显示全部楼层
打卡
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-1-3 22:00:36 | 显示全部楼层
集合分为可变集合和不可变集合,set() 为一般集合,frozenset() 是不可变集合,对集合做变动操作是对于可变集合来说,add() 方法是将传入的字符串整体作为一个元素插入集合中,与update() 等方法迭代获取字符串的每一位字节处理不同;remove() 方法与 discard() 方法的区别在于指定的元素不存在时 ,前者会抛出 KeyError 异常,后者则不会抛出异常。哈希即:某个对象的哈希值(可通过内置函数hash() 来获取),在其整给程序的生命周期中保持不变,python 中大多数不可变对象都是可哈希的,而不可变对象都是不可哈希的,同时将列表转换成集合能够大幅度提升程序的执行效率,因为集合的背后有散列表的支持,而列表则没有,换句话,列表的每次查询都是从头到尾的扫描,而集合则只需要简单的查表操作。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-31 20:07:19 | 显示全部楼层
打卡
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-2-1 13:46:51 | 显示全部楼层
继续坚持学习  但好像前面学习过的又忘记了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-25 20:05:34 | 显示全部楼层
集合(下)
        1. 冻结的集合
                >>> t = frozenset("FishC")
>>> t
frozenset({'s', 'C', 'i', 'F', 'h'})
        2.适用于set()对象的方法
                update(*others) 方法使用 others 容器中的元素来更新集合
                        >>> s = set("FishC")
>>> s
{'s', 'C', 'i', 'F', 'h'}
>>> s.update([1, 1], "23")
>>> s
{'s', 1, 'C', 'i', 'F', 'h', '3', '2'}
                intersection_update(*others) 交集
                         s.intersection_update("FishC")
>>> s
{'s', 'C', 'i', 'F', 'h'}
                difference_update(*others) 差集
                        s.difference_update("Php", "Python")
>>> s
{'s', 'C', 'i', 'F'}
                symmetric_difference_update(other) 对称差集
                        s.symmetric_difference_update("Python")
>>> s
{'s', 't', 'C', 'o', 'h', 'i', 'y', 'F', 'n', 'P'}
                add()方法 添加一个数据
                        >>> s.add("45")
>>> s
{'s', 't', 'C', 'o', 'h', 'i', 'y', 'F', '45', 'n', 'P'}
                删除数据
                         remove(elem) 指定字符
                                 s.remove("瓦迈")
                        discard(elem) 静默删除
                                s.discard("瓦迈")
                        pop() 方法 用于随机从集合中弹出一个元素
                                >>> s.pop()
's'
>>> s.pop()
't'
>>> s.pop()
'C'
>>> s
{'o', 'h', 'i', 'y', 'F', '45', 'n', 'P'}
                        clear() 方法 将集合清空
                                >>> s.clear()
>>> s
set()
                可哈希
                         hash() 函数 轻松获取一个对象的哈希值
                                >>> hash(1)
1
>>> hash(1.0)
1
>>> hash(1.001)
2305843009213441
        嵌套的集合
                不可变集合 “冰山美人” frozenset() 对象
                        >>> x = frozenset(x)
>>> y = {x, 4, 5}
>>> y
{frozenset({1, 2, 3}), 4, 5}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-12 13:47:14 | 显示全部楼层
一周过去了才学个二十集我真的会谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-12 17:35:18 | 显示全部楼层
本帖最后由 xiaohongchen 于 2023-9-12 17:37 编辑

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-4 01:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表