set 中的哈希表在 python 中如何工作?

2024-04-24

据我所知,set在python中通过哈希表来实现O(1)查找复杂度。虽然它是哈希表,但其中的每个条目set必须是可散列的(或不可变的)。 所以这种和平的代码引发了异常:

>>> {dict()}
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'

Because dict不可散列。但是我们可以创建我们自己的类继承自dict并实施__hash__魔法方法。我以这种方式创建了自己的:

>>> class D(dict):
...     def __hash__(self):
...             return 3
...

我知道它不应该正常工作,但我只是想尝试一下。所以我检查了我现在可以在中使用这种类型set:

>>> {D()}
{{}}
>>> {D(name='ali')}
{{'name': 'ali'}}

到目前为止一切顺利,但我认为这种实施方式__hash__魔术方法会搞砸查找set。因为每一个对象的D具有相同的哈希值。

>>> d1 = D(n=1)
>>> d2 = D(n=2)
>>> hash(d1), hash(d2)
(3, 3)
>>> 
>>> {d1, d2}
{{'n': 2}, {'n': 1}}

但令我惊讶的是:

>>> d3 = D()
>>> d3 in {d1, d2}
False

我预计结果是True,因为散列d3 is 3目前我们的集合中存在具有相同哈希值的值。如何set内部工作?


为了可以在集合和字典中使用,__hash__方法必须保证如果x == y, then hash(x) == hash(y)。但这是一种片面的暗示。根本不需要如果hash(x) == hash(h) then x == y一定是真的。事实上,这通常是不可能实现的(例如,有无限数量的不同 Python 整数,但只有有限数量的哈希码 - 那里must是具有相同哈希值的不同整数)。

你的哈希值全部相同就很好。他们只告诉 set/dict 去哪里start看着。然后,将容器中具有相同哈希值的所有对象一一进行比较,以确保相等,直到成功,或者直到尝试了所有此类对象均未成功。

然而,虽然使所有哈希值相同不会损害正确性,但这对性能来说是一场灾难:它有效地将 set/dict 变成了一种异常缓慢的方式来执行O(n)线性搜索。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

set 中的哈希表在 python 中如何工作? 的相关文章

  • 如何使用固定的 pandas 数据框进行动态 matplotlib 绘图?

    我有一个名为的数据框benchmark returns and strategy returns 两者具有相同的时间跨度 我想找到一种方法以漂亮的动画风格绘制数据点 以便它显示逐渐加载的所有点 我知道有一个matplotlib animat
  • 如何收集列表、字典等中重复计算的结果(或制作修改每个元素的列表的副本)?

    There are a great many existing Q A on Stack Overflow on this general theme but they are all either poor quality typical
  • DreamPie 不适用于 Python 3.2

    我最喜欢的 Python shell 是DreamPie http dreampie sourceforge net 我想将它与 Python 3 2 一起使用 我使用了 添加解释器 DreamPie 应用程序并添加了 Python 3 2
  • 如何打印没有类型的defaultdict变量?

    在下面的代码中 from collections import defaultdict confusion proba dict defaultdict float for i in xrange 10 confusion proba di
  • Python 多处理示例不起作用

    我正在尝试学习如何使用multiprocessing但我无法让它发挥作用 这是代码文档 http docs python org 2 library multiprocessing html from multiprocessing imp
  • 安装后 Anaconda 提示损坏

    我刚刚安装张量流GPU创建单独的后环境按照以下指示here https github com antoniosehk keras tensorflow windows installation 但是 安装后当我关闭提示窗口并打开新航站楼弹出
  • IRichBolt 在storm-1.0.0 和 pyleus-0.3.0 上运行拓扑时出错

    我正在运行风暴拓扑 pyleus verbose local xyz topology jar using storm 1 0 0 pyleus 0 3 0 centos 6 6并得到错误 线程 main java lang NoClass
  • feedparser 在脚本运行期间失败,但无法在交互式 python 控制台中重现

    当我运行 eclipse 或在 iPython 中运行脚本时 它失败了 ascii codec can t decode byte 0xe2 in position 32 ordinal not in range 128 我不知道为什么 但
  • python 集合可以包含的值的数量是否有限制?

    我正在尝试使用 python 设置作为 mysql 表中 ids 的过滤器 python集存储了所有要过滤的id 现在大约有30000个 这个数字会随着时间的推移慢慢增长 我担心python集的最大容量 它可以包含的元素数量有限制吗 您最大
  • ExpectedFailure 被计为错误而不是通过

    我在用着expectedFailure因为有一个我想记录的错误 我现在无法修复 但想将来再回来解决 我的理解expectedFailure是它会将测试计为通过 但在摘要中表示预期失败的数量为 x 类似于它如何处理跳过的 tets 但是 当我
  • 循环中断打破tqdm

    下面的简单代码使用tqdm https github com tqdm tqdm在循环迭代时显示进度条 import tqdm for f in tqdm tqdm range 100000000 if f gt 100000000 4 b
  • Python - 按月对日期进行分组

    这是一个简单的问题 起初我认为很简单而忽略了它 一个小时过去了 我不太确定 所以 我有一个Python列表datetime对象 我想用图表来表示它们 x 值是年份和月份 y 值是此列表中本月发生的日期对象的数量 也许一个例子可以更好地证明这
  • Python 3 中“map”类型的对象没有 len()

    我在使用 Python 3 时遇到问题 我得到了 Python 2 7 代码 目前我正在尝试更新它 我收到错误 类型错误 map 类型的对象没有 len 在这部分 str len seed candidates 在我像这样初始化它之前 se
  • 在Python中重置生成器对象

    我有一个由多个yield 返回的生成器对象 准备调用该生成器是相当耗时的操作 这就是为什么我想多次重复使用生成器 y FunctionWithYield for x in y print x here must be something t
  • Python:计算字典的重复值

    我有一本字典如下 dictA unit1 test1 alpha unit1 test2 beta unit2 test1 alpha unit2 test2 gamma unit3 test1 delta unit3 test2 gamm
  • 在 Pandas DataFrame Python 中添加新列[重复]

    这个问题在这里已经有答案了 例如 我在 Pandas 中有数据框 Col1 Col2 A 1 B 2 C 3 现在 如果我想再添加一个名为 Col3 的列 并且该值基于 Col2 式中 如果Col2 gt 1 则Col3为0 否则为1 所以
  • glpk.LPX 向后兼容性?

    较新版本的glpk没有LPXapi 旧包需要它 我如何使用旧包 例如COBRA http opencobra sourceforge net openCOBRA Welcome html 与较新版本的glpk 注意COBRA适用于 MATL
  • 在 Python 类中动态定义实例字段

    我是 Python 新手 主要从事 Java 编程 我目前正在思考Python中的类是如何实例化的 我明白那个 init 就像Java中的构造函数 然而 有时 python 类没有 init 方法 在这种情况下我假设有一个默认构造函数 就像
  • Python - 字典和列表相交

    给定以下数据结构 找出这两种数据结构共有的交集键的最有效方法是什么 dict1 2A 3A 4B list1 2A 4B Expected output 2A 4B 如果这也能产生更快的输出 我可以将列表 不是 dict1 组织到任何其他数
  • 改变字典的哈希函数

    按照此question https stackoverflow com questions 37100390 towards understanding dictionaries 我们知道两个不同的字典 dict 1 and dict 2例

随机推荐

  • 获取类实现的接口

    我正在做装配分析项目 遇到了问题 我想要实现的是一个类实现的所有接口的列表 但没有派生接口 以及派生类实现的接口 这是一个例子来说明 来自 LinqPad Dump 是打印到结果窗口 void Main typeof A GetInterf
  • 即使我已禁用所有相关 CSS,我的网站链接下仍出现蓝线? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我尝试过禁
  • WebPack-Dev-Server 错误:未定义 require

    Webpack 本身工作正常 但 webpack dev server 却不行 基本上 webpack 为我创建了 2 个构建文件 一个后端包和一个前端包 因此 我为每一个都有一个 webpack config js 我想使用 webpac
  • C 中何时释放指针以及如何知道它是否被释放

    我是 C 语言的新手 试图弄清楚 C 语言中的内存分配 我有点困惑 include
  • ejabberd 支持离线文件传输吗? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我正在开发 XMPP 客户端 使用 ejabberd 作为服务器 我的问题是如何支持离线文件传输 我只想对图像文件进行离线文件传输 例如 即使约翰离线
  • WordPress:本地主机上的自定义默认头像?

    我正在尝试在functions php 中向WordPress 添加自定义默认头像 但该图像未显示在 设置 讨论 或网站上的其他位置 该代码有效 因为添加了带有自定义字段名称的新单选字段 但图像不会显示 头像不显示是因为我使用的是本地主机吗
  • ASP.NET 在当前上下文中不存在

    我面临一个问题 我使用了 dropdownList 控件 ID 是drpDownCountries在 ASP NET 项目中 dropdownlist控件放置在页面上 在C 的代码隐藏文件中 同时键入控件名称drpDownCountries
  • 将 XML 作为参数传递给 Web 服务

    In an answer https stackoverflow com questions 2597056 is there an xmlencode xmldecode for net 2597262 2597262对于另一个问题 有人
  • 生成器理解如何工作?

    生成器理解有什么作用 它是如何工作的 我找不到有关它的教程 你了解列表推导式吗 如果是这样 生成器表达式就像一个列表理解 但它不是查找您感兴趣的所有项目并将它们打包到列表中 而是等待 并从表达式中逐一生成每个项目 gt gt gt my l
  • 我如何选择这个跨度元素?

    我刚刚开始使用 Selenium 现在需要选择这个元素 span class close Matrices span 这行代码返回零个元素 所以我猜它不是正确的 ReadOnlyCollection
  • Criteria.DISTINCT_ROOT_ENTITY 不会阻止重复的对象

    我有以下 dao 方法 Override public List
  • 玩法:如何实现动作组合

    鉴于以下情况ActionBuilder实施 class SignedRequest A request Request A extends WrappedRequest A request object SignedAction exten
  • 创建具有通用返回类型的 FlinkSQL UDF

    我想定义函数MAX BY接受类型值T和类型的订购参数Number并根据排序从窗口返回最大元素 类型为T 我试过了 public class MaxBy
  • 在哪里可以找到所有谷歌地图 v3 事件列表?

    正如标题 我搜索了官方谷歌地图 API 参考和其他网站 我找不到完整可用事件的文档列表 请给我一个提示来获取所有 v3 事件 多谢 API参考 https developers google com maps documentation j
  • JavaScript 获取当前应用于元素的样式列表

    List only渲染的样式 而不是未应用的任意样式 我尝试了很多方法来将样式应用于元素 但结果都是空白 请不要引用getComputedStyle除非你能解决垃圾退货问题 否则这是一个解决方案 主要问题是window getCompute
  • 有没有办法让 gpg 签署所有以前的提交?

    正如标题所示 我正在寻找一种方法来 gpg 签署存储库中我以前的所有提交 最好不要为每次提交输入密码 我的方法是 git rebase exec git commit amend no edit n S i 8fd7b22 所有提交从下一个
  • python 课堂上有太多自我

    我正在学习 Python OOP 并尝试将 Java 类转换为 Python 类 请参阅此 PDF 中的第 15 页了解 Java 代码 google 文档link https docs google com open id 1eqzajO
  • Flutter 项目中任务“:app:processDebugResources”执行失败

    我从 7 月份开始重新开始 Flutter 项目的工作 并且遇到了大量的依赖问题 我正在慢慢解决这些问题 然而 这个我就是无法摆脱 Launching lib main dart on sdk gphone x86 in debug mod
  • imageView 中的圆角[重复]

    这个问题在这里已经有答案了 这是我的 xml 布局
  • set 中的哈希表在 python 中如何工作?

    据我所知 set在python中通过哈希表来实现O 1 查找复杂度 虽然它是哈希表 但其中的每个条目set必须是可散列的 或不可变的 所以这种和平的代码引发了异常 gt gt gt dict Traceback most recent ca