对象作为 python 字典中的键

2024-02-07

我试图使用一个对象作为 python 字典中的键,但它的行为方式我不太理解。

首先,我创建一个以我的对象为键的字典:

package_disseminators = {
  ContentType("application", "zip", "http://other/property") : "one",
  ContentType("application", "zip") : "two"
}

现在创建另一个与作为键的对象“相同”的对象。

content_type = ContentType("application", "zip", "http://other/property")

我已经给了 ContentType 对象自定义__eq__和定制__str__方法,使得__eq__方法比较了__str__ values.

现在,一些交互式Python:

>>> for key in package_disseminators:
...     if key == content_type:
...             print "match"
...     else:
...             print "no match"
... 
no match
match

>>> content_type in package_disseminators.keys()
True

好的,看起来我的对象肯定被正确识别为密钥,所以:

>>> package_disseminators[content_type]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: (& (type="application/zip") (packaging="http://other/property") )

呃……好吧?所以 content_type 在 package_disseminators.keys() 列表中,但不是键?

>>> package_disseminators.has_key(content_type)
False

显然不是。

我认为 Python 用于确定相等性的比较过程在列表上的直接“in”语句和实际在字典中查找键之间有所不同,但我不知道如何。有什么建议或见解吗?


来自 python 文档:

字典的键几乎都是 任意值。不存在的值 可散列,即包含的值 列表、字典或其他可变的 类型(按值进行比较 而不是通过对象标识)可以 不能用作钥匙。

Hashable http://docs.python.org/glossary.html#term-hashable定义如下

如果一个对象有哈希值,那么它就是可哈希的 其值在其期间永远不会改变 寿命(它需要一个__hash__()方法),并且可以与其他方法进行比较 对象(它需要一个__eq__() or __cmp__()方法)。比较相等的可哈希对象必须具有相同的 哈希值。

可散列性使对象可以用作 字典键和集合成员, 因为这些数据结构使用 内部哈希值。

所以如果你想这样做,你需要覆盖默认的__hash__()对象上的方法(请参阅下面 Steven Rumbalski 的评论以获取进一步的解释)。


>>> content_type in package_disseminators.keys()
True

我想这有效是因为dict.keys()返回一个列表,并且__contains__可能检查相等性,但不检查相同的哈希值。

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

对象作为 python 字典中的键 的相关文章

  • 如何将base64字符串直接解码为二进制音频格式

    音频文件通过 API 发送给我们 该文件是 Base64 编码的 PCM 格式 我需要将其转换为 PCM 然后再转换为 WAV 进行处理 我能够使用以下代码解码 gt 保存到 pcm gt 从 pcm 读取 gt 保存为 wav decod
  • Python从int到string的快速转换

    我正在用 python 求解大量阶乘 并发现当我完成计算阶乘时 需要相同的时间才能转换为字符串以保存到文件中 我试图找到一种将 int 转换为字符串的快速方法 我将举一个计算和 int 转换时间的例子 我正在使用通用的 a str a 但感
  • TF map_fn 或 while_loop 用于不同形状的张量列表

    我想处理不同形状的张量序列 列表 并输出另一个张量列表 考虑每个时间戳上具有不同隐藏状态大小的 RNN 就像是 输入 tf ones 1 2 2 tf ones 2 2 3 tf ones 3 2 1 输出 tf zeros 1 2 4 t
  • 了解 Python 中的酸洗

    我最近接到一项作业 需要以腌制形式放置一本字典 其中每个键引用一个列表 唯一的问题是我不知道腌制形式是什么 谁能给我指出一些好的资源的正确方向来帮助我学习这个概念 pickle 模块实现了一个基本但强大的算法 用于序列化和反序列化 Pyth
  • 更新 Sqlalchemy 中的多个列

    我有一个在 Flask 上运行的应用程序 并使用 sqlalchemy 与数据库交互 我想用用户指定的值更新表的列 我正在使用的查询是 def update table value1 value2 value3 query update T
  • 在 macOS 中通过 Python 访问进程的压缩 RAM(顶部的 CMPRS)的方法?

    我试图弄清楚如何从 Python 访问任何给定进程占用的实际 RAM 量 我发现 psutil Process PID memory info rss 工作得很好 直到操作系统决定开始压缩某些进程的 RAM 然后 所有的 memory in
  • 如何在 Python 3 中循环遍历集合,同时从集合中删除项目

    这是我的情况 我有一个list set 哪个并不重要 movieplayer我想调用的对象 preload 功能开启 该预加载函数可以立即返回 但希望将来返回一点 我想存储这个电影播放器 集合 表明它们尚未预加载 然后循环它们 调用prel
  • 可以用 Django 制作移动应用程序吗?

    我想知道我是否可以在我的网站上使用 Django 代码 并以某种方式在移动应用程序 Flutter 等框架中使用它 那么是否可以使用我现在拥有的 Django 后端并在移动应用程序中使用它 所以就像models views etc 是的 有
  • python是带有字符串的运算符行为[重复]

    这个问题在这里已经有答案了 我无法理解以下行为 我正在创建 2 个字符串 并使用 is 运算符来比较它 对于第一种情况 它的工作方式有所不同 对于第二种情况 它按预期工作 当我使用逗号或空格时 它显示是什么原因False与比较is当没有使用
  • 为什么我无法在 Mac OS X Terminal.app 上的 Python 解释器中显示 unicode 字符?

    如果我尝试粘贴 unicode 字符 例如中间的点 在我的 python 解释器中它什么也不做 我在 Mac OS X 上使用 Terminal app 当我只是在 bash 中时 我没有遇到任何问题 但在解释器中 python Pytho
  • Pandas 滚动窗口 Spearman 相关性

    我想使用滚动窗口计算 DataFrame 两列之间的 Spearman 和 或 Pearson 相关性 我努力了df corr df col1 rolling P corr df col2 P为窗口尺寸 但我似乎无法定义该方法 添加meth
  • 如何使用 paramiko 查看(日志)文件传输进度?

    我正在使用 Paramiko 的 SFTPClient 在主机之间传输文件 我希望我的脚本打印文件传输进度 类似于使用 scp 看到的输出 scp my file user host user host password my file 1
  • 具有屏蔽无效值的 pcolormesh

    我试图将一维数组绘制为 pcolormesh 因此颜色沿 x 轴变化 但每个 x 的 y 轴保持不变 但我的数据有一些错误值 因此我使用屏蔽数组和自定义颜色图 其中屏蔽值设置为蓝色 import numpy as np import mat
  • Pandas style.bar 颜色基于条件?

    如何渲染其中一列的 Pandas dfstyle bar color属性是根据某些条件计算的 Example df style bar subset before after color ff781c vmin 0 0 vmax 1 0 而
  • 在 Sphinx 中,有没有办法在声明参数的同时记录参数?

    我更喜欢在声明参数的同一行记录每个参数 根据需要 以便应用D R Y http en wikipedia org wiki Don t repeat yourself 如果我有这样的代码 def foo flab nickers a ser
  • 无法在 python 3.8 上将带有 webapp 的 python 部署到 azure

    我正在尝试使用部署一个测试项目Flask使用以下方法将框架迁移到 Azure 云中Azure CLI https learn microsoft com en us azure app service containers quicksta
  • 如何将回溯/sys.exc_info() 值保存在变量中?

    我想将错误名称和回溯详细信息保存到变量中 这是我的尝试 import sys try try print x except Exception ex raise NameError except Exception er print 0 s
  • 如何使用 Keras ImageDataGenerator 预测单个图像?

    我已经训练 CNN 对图像进行 3 类分类 在训练模型时 我使用 keras 的 ImageDataGenerator 类对图像应用预处理功能并重新缩放它 现在我的网络在测试集上训练得非常准确 但我不知道如何在单图像预测上应用预处理功能 如
  • 如何在 robobrowser-python 中发出 POST 请求

    http robobrowser readthedocs org en latest api html http robobrowser readthedocs org en latest api html 我正在尝试使用 APIbrows
  • python sklearn中的fit方法

    我问自己关于 sklearn 中拟合方法的各种问题 问题1 当我这样做时 from sklearn decomposition import TruncatedSVD model TruncatedSVD svd 1 model fit X

随机推荐

  • 在临时表列 SQL 中设置排序规则的正确方法

    我有一个临时表 它使用批量插入来插入数据 但是 当我想将临时表中的数据更新到普通表时 它会出现排序规则问题 我知道如何通过使用类似的方法来解决这个问题 UPDATE RegularTable SET r Column1 t ColumnA
  • 在哪里可以找到 Java 语法突出显示库? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在用 Java 编写一个源代码编辑器 用于 Java 源代码 并且我想添加简单的语法突出显示 关键
  • 我试图在 bulma css 上使用汉堡菜单,但它不起作用。怎么了?

    我是 bulma css 新手http bulma io http bulma io 我正在尝试为移动用户使用汉堡菜单 我只是按照此页面上的说明进行操作 http bulma io documentation components nav
  • 对一组事实进行排序 CLIPS

    我正在尝试根据基于两个字段的比较器对 CLIPS 中的事实集合进行排序 不幸的是 我无法理解为什么如果传递的两个事实中第一个字段相同 则比较器 显然是正确的 会打印 2 我的比较器 deffunction MAIN rating sort
  • C++ 按位复制与按成员复制? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Javascript Set() 中的成员数量是否有限制?或者这是V8中的一个错误

    下面是一些简单的 Javascript 代码 它将整数重复添加到 Set 中 var i var limit 1 lt lt 24 var s new Set for i 0 i lt limit 10 i s add i if i gt
  • 关机还是不关机?在ExecutorService(Java8)中

    我试图了解执行程序服务相对于关闭的行为 文档说 除非有 shutdown 调用 否则应用程序不会终止 但在这个简单的示例中 它会在一分钟后精确退出 任何想法 Runnable r new Runnable Override public v
  • 调整阈值cros_val_score sklearn

    有没有办法设置sklearn的cross val score阈值 我训练了一个模型 然后将阈值调整为 0 22 型号如下 Try with Threshold pred proba LGBM Model predict proba X te
  • Python 3 Windows 服务仅在调试模式下启动

    我首先在中发布了答案这个帖子 https stackoverflow com questions 42586805 python 3 windows service 但不符合论坛标准 我希望这次的回答符合论坛标准 这段代码应该更加清晰易读
  • 当参数未显式传递时,默认使用 lambda 进行用户输入

    我写了下面的代码 仍然想知道它的用途 https codereview stackexchange com questions 242702 how effective is it to default to user input in c
  • Visual Studio 在调试时跳到每隔一行

    我现在尝试单步执行代码 Visual Studio 会跳过所有其他行 我知道它是每隔一个 因为当我有一个 ForEach 循环时 它会碰到在以后的迭代中跳过的行 Visual Studio 是否有任何逻辑原因跳过其他行 UPDATE 我添加
  • 如何迭代 Array.prototype 函数

    我想将所有数组函数包装在数组对象中 但在控制台中 gt gt gt Array prototype gt gt gt prototype undefined 但是当我输入时Array prototype在控制台中它显示自动完成中的所有功能
  • System.Diagnostics.Trace.WriteLine 的结果在哪里?

    在我的代码中 我使用以下命令编写了一些跟踪消息System Diagnostics Trace WriteLine 但是我可以从哪里获取消息呢 我查看了事件查看器 但没有找到它们 Are you debugging Look at the
  • 将 Google Maps JS API ImageMapType 剪辑为多边形

    如何将 Google 地图中的 MapType 剪辑为任意多边形 例如 如果我有一个自定义图像映射类型 https developers google com maps documentation javascript maptypes I
  • Typescript:调用另一个类的“方法”

    我对 java type script 很陌生 在理解它们的概念时遇到了一些困难 我想打电话给method另一个班级的 然而 到目前为止我还没有成功 export class Foo calcSomeThing parameter numb
  • 如何仅使用 javascript 更改 onclick 按钮颜色?

    我试图使用 onclick 和 getElementsByClassName 更改按钮的颜色 并想出了这样的结果 HTML
  • Android 2.3 Webview 中的希伯来字体

    我正在将一个显示希伯来语的应用程序移植到 Android 2 3 2 3 模拟器在 TextView 中正确显示字符串 但是当我尝试将字符串放入 WebView 中时 WebView 只显示乱码 这告诉我希伯来语字体在模拟器中可用 但 we
  • 执行更新时存储过程失败

    我正在使用 PHP 的 SQL Server 驱动程序连接到 SQL Server 2008 Express 现在 我正在尝试用存储过程替换所有 SELECT UPDATE 和 INSERT 语句 这对于只包含 SELECT 语句的 SP
  • 将 Ninject 2.0 与 ASP .Net 3.5 结合使用

    我正在尝试将 Ninject 2 0 与 Asp Net 3 5 Web 应用程序一起使用 以下是 DLLS 及其我正在使用的版本 Ninject dll v2 0 0 0 Ninject Extensions Logging dll v2
  • 对象作为 python 字典中的键

    我试图使用一个对象作为 python 字典中的键 但它的行为方式我不太理解 首先 我创建一个以我的对象为键的字典 package disseminators ContentType application zip http other pr