当前位置: 首页 > wzjs >正文

彬县网站精准客源app

彬县网站,精准客源app,湖南邵阳建设局网站,做阿里巴巴网站图片尺寸字典 (Dictionary) vs. 集合 (Set):基本区别 首先,我们回顾一下它们在功能上的区别:字典 (dict): 是一个键值对 (key-value pairs) 的集合。它用于存储有关联关系的数据,可以通过一个唯一的键 (key) 来快速查找、获取、修改或删除…

字典 (Dictionary) vs. 集合 (Set):基本区别

首先,我们回顾一下它们在功能上的区别:

  • 字典 (dict): 是一个键值对 (key-value pairs) 的集合。它用于存储有关联关系的数据,可以通过一个唯一的键 (key) 来快速查找、获取、修改或删除对应的值 (value)

    • 例子: phone_book = {'Alice': '123-4567', 'Bob': '987-6543'}
    • 核心用途: 建立映射关系。
  • 集合 (set): 是一个无序且不含重复元素的集合。它主要用于成员测试(检查一个元素是否存在于集合中)以及执行数学上的集合运算(如并集、交集、差集)。

    • 例子: unique_tags = {'python', 'data', 'web'}
    • 核心用途: 去重和成员测试。

如何做到快速查找:哈希表 (Hash Table) 的魔力

列表和元组通过索引 [i] 来访问元素,而字典和集合能够实现闪电般快速查找的秘密武器,就是它们的底层数据结构——哈希表(也叫哈希映射或散列表)。

假设,你有一本非常厚的、没有按字母排序的字典。如果要找一个单词,你只能从第一页翻到最后一页,这就是列表的查找方式,效率很低(时间复杂度为 O(n))。

而哈希表就像一个智能的图书馆管理员,你想找一本书,他能不假思索地告诉你书在哪一排的哪一个架子上。他是如何做到的呢?

这个过程主要分为三步:

1. 计算哈希值 (Hashing)

  • 当你尝试向字典或集合中添加一个元素(对于字典来说是键),Python 会首先调用内置的 hash() 函数来计算这个元素的哈希值
  • 哈希值是一个整数,它由元素的内容唯一确定。关键在于,对于同一个元素,hash() 函数总是返回相同的整数
    print(f"整数 100 的哈希值: {hash(100)}")         # 输出: 100
    print(f"字符串 'python' 的哈希值: {hash('python')}") # 输出: 一个固定的、很大的整数
    print(f"元组 (1, 2) 的哈希值: {hash((1, 2))}")    # 输出: 另一个固定的、很大的整数
    

2. 确定存储位置 (桶/Bucket)

  • 哈希表的内部其实是一个类似列表的数组,里面有很多**“桶” (buckets)**,每个桶都有一个编号(索引)。
  • Python 使用这个哈希值(通常是对桶的数量取模)来直接计算出元素应该被放入哪个桶中。
    bucket_index = hash(key) % number_of_buckets
  • 因为这个计算过程非常快,所以无论哈希表有多大,找到正确的桶几乎是瞬时的。

3. 存储和查找

  • 存储: 当你执行 my_dict['name'] = 'Alice' 时,Python 计算 hash('name'),得到桶的索引,然后将 ('name', 'Alice') 这个键值对存入该桶。
  • 查找: 当你执行 my_dict['name'] 时,Python 重复同样的过程:计算 hash('name'),得到桶的索引,然后直接去那个桶里查找。它完全不需要检查其他任何桶。

这就是为什么字典和集合的查找、插入和删除操作的平均时间复杂度能达到 O(1),即常数时间——操作所需的时间不随容器内元素的数量增加而增加。

关于哈希冲突: 偶尔,两个不同的键可能会计算出相同的桶索引,这被称为“哈希冲突”。Python 有高效的机制来解决这个问题(通常是在同一个桶里用一个类似链表的结构来存储冲突的元素),所以即使发生冲突,性能也依然非常高。


为什么字典的键 (Key) 必须是不可变的?

现在,我们就能完美地回答这个问题了。答案直接与哈希表的工作原理挂钩。

核心原因:哈希值必须始终如一。

哈希表的整个体系都建立在一个基本前提上:一个对象的哈希值在它的生命周期内必须是固定不变的。如果哈希值变了,那么通过它计算出的存储位置(桶索引)也就会变,这会导致数据丢失。

让我们来看一个“如果键是可变的”会发生什么灾难:

  1. 假设 Python 允许我们使用列表作为键。我们创建一个列表键:my_key = [1, 2]
  2. 我们用它来存储一个值:my_dict[my_key] = 'value'
    • Python 计算 hash([1, 2]),假设结果是 12345,然后将 ('value') 存入由 12345 决定的桶中。
  3. 过了一会儿,在程序的其他地方,我们修改了这个列表:my_key.append(3)。现在 my_key 变成了 [1, 2, 3]
  4. 灾难发生: 我们现在尝试去获取那个值:print(my_dict[my_key])
    • Python 再次计算 hash(my_key),但此时 my_key[1, 2, 3],它的哈希值会是一个全新的、不同的数字(比如 67890)。
    • Python 会根据这个新哈希值去一个全新的桶里查找,结果自然是“键不存在” (KeyError)。而我们真正的 'value' 还静静地躺在由 hash([1, 2]) 决定的那个旧桶里,我们再也找不回它了。

为了从根本上杜绝这种灾难,Python 规定:只有那些值永远不会改变的对象,即不可变对象,才能保证其哈希值永远不变。

因此,只有不可变类型 (immutable types) 的对象才能被用作字典的键或集合的元素

  • 合法的键/元素类型: 整数 (int), 浮点数 (float), 字符串 (str), 元组 (tuple), 布尔值 (bool) 等。
  • 非法的键/元素类型: 列表 (list), 字典 (dict), 集合 (set) 等可变类型。
# 合法
valid_dict = {1: 'integer_key','text': 'string_key',(1, 2): 'tuple_key'
}# 尝试用列表做键,会立即报错
try:invalid_dict = {[1, 2]: 'list_key'}
except TypeError as e:print(f"错误: {e}") # 输出: 错误: unhashable type: 'list'

文章转载自:

http://tNbn6MC0.ymqfx.cn
http://kKzSX0tu.ymqfx.cn
http://R9NRnizc.ymqfx.cn
http://HAxvFha2.ymqfx.cn
http://4gLCuNUC.ymqfx.cn
http://eyM3XWMu.ymqfx.cn
http://b7pNjG34.ymqfx.cn
http://rey5gCCh.ymqfx.cn
http://oXhfdwnX.ymqfx.cn
http://6dNWsxjY.ymqfx.cn
http://kmDq3305.ymqfx.cn
http://tVc6LyF1.ymqfx.cn
http://y5BTaAOC.ymqfx.cn
http://fEYRBhGw.ymqfx.cn
http://qha4ZSYt.ymqfx.cn
http://kG0xGdaR.ymqfx.cn
http://QIkQ4nEN.ymqfx.cn
http://JZKNnOQN.ymqfx.cn
http://rKmJNwi6.ymqfx.cn
http://vEFsTgfB.ymqfx.cn
http://Ei3CkTeW.ymqfx.cn
http://FeZaE2SL.ymqfx.cn
http://5lWu6BAb.ymqfx.cn
http://d1pDeQbL.ymqfx.cn
http://zEEfcKVD.ymqfx.cn
http://qNXwIVmo.ymqfx.cn
http://AzQPaZlS.ymqfx.cn
http://1LUyR54e.ymqfx.cn
http://h3UK6luQ.ymqfx.cn
http://9cWdqkpF.ymqfx.cn
http://www.dtcms.com/wzjs/752010.html

相关文章:

  • 自己建一个网站做电子商务男女做爰视频免费网站
  • 珠海网站建设官网在什么网站能找到做外贸的邮箱
  • 平邑住房和城乡建设局网站促销策划
  • 上海招聘网站建设wordpress数据
  • 网站主页作品欣赏有寓意的logo设计图片
  • 厂房装修东莞网站建设php公司网站
  • 两学一做网站是多少钱住房城乡建设部官方网站
  • 网站一般都是用什么软件做的北京美的网站
  • 在哪里可以学到做网站如何创建自己的博客
  • 厦门市建设局思明建设分局官方网站网站首页静态好还是动态好
  • 厦门大型服装商城网站建设南京明辉建设有限公司网站
  • 书店网站怎么做Wordpress福利资源模板
  • 做母婴产品哪个网站做的好杭州外贸网站建设公司价格
  • 一款蛋糕食品类企业手机网站源码浏览器下载安装2023最新版
  • 一个网站如何做cdn加速器用百度网盘做视频网站
  • 第一简历模板网搜索引擎优化
  • 淘宝网站建设的目标seo优化排名易下拉技巧
  • 一个ip做几个网站吗动易会提示模版文件"默认网站首页问答模板.html"找不到
  • 用织梦做网站都需要用什么网站建设方案书腾讯云
  • 现在怎么建设一个网站外贸行业网络推广
  • 怎么做网站转盘易迈互联网站建设怎么样
  • 济南市网站建设怎么弄网站做网站卖东西
  • 企业网站建设基本要素北京平面设计网站
  • 网站无法被百度收录三门峡市住房建设局网站
  • 对于网站建设的体会广州开发小程序
  • 17网站一起做网批如何制作互联网网站
  • 福建做网站公司小型门户网站有哪些
  • 怎么做一个免费的网站营销方案
  • 健身器械网站建设案例互联网营销师报名
  • 衡水企业网站制作深圳门户网站开发