Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从dict中的键检索键_Python_Dictionary - Fatal编程技术网

Python 从dict中的键检索键

Python 从dict中的键检索键,python,dictionary,Python,Dictionary,我有一个类Foo,它有一个实例字符串变量id。我实现了\uuuu eq\uuuu和\uuuu hash\uuuu魔术方法,因此它们只使用id,因此Foo实例及其字符串id映射到同一个哈希表存储桶。但是,假设有一个dict,其键是Foo实例,我只有字符串id。我想检索Foo实例,该实例中存在id 一种方法是遍历dict中的所有键,但是否有更有效/简单的方法?无法检索直接使用键的相应Foo()对象,否 您可以选择在所有键上循环并匹配id属性,或者使用Foo(id)重新创建对象;如果您只需要将其用作查

我有一个类
Foo
,它有一个实例字符串变量
id
。我实现了
\uuuu eq\uuuu
\uuuu hash\uuuu
魔术方法,因此它们只使用
id
,因此
Foo
实例及其字符串
id
映射到同一个哈希表存储桶。但是,假设有一个dict,其键是
Foo
实例,我只有字符串
id
。我想检索
Foo
实例,该实例中存在
id


一种方法是遍历dict中的所有键,但是否有更有效/简单的方法?

无法检索直接使用键的相应
Foo()
对象,否

您可以选择在所有键上循环并匹配
id
属性,或者使用
Foo(id)
重新创建对象;如果您只需要将其用作查找键,那么这就足够了


如果这些对象具有更多的属性和<代码> ID 映射到这些属性,请考虑添加另一个字典,将映射ID保持到FoE()/Case>实例。

< P>只需用给定的<代码> ID <代码>创建哑<代码> FoO 对象,在地图上查一下。

除了@Martijn Pieters的答案:

如果你的
Foo
很重,你可以用最小的功能(
self.id
\uuuuuuuuueq\uuuu
\uuuu hash\uuuuuu
)定义一个类
Bar
,并使你的
Foo
继承自它


然后,您可以使用轻量级
Bar
实例从字典中检索与
Foo
对象关联的值。

我需要检索存储在dict中的
Foo
实例的相同引用,因此实例化新的
Foo
实例不是一个选项。我喜欢为
id:Foo
映射单独设置一个
dict
的想法。它以牺牲空间效率换取速度。大多数情况下,代码范围只知道字符串
id
,它需要修改相应的
Foo
实例,因此我认为我必须使用单独的dict。我意识到我的代码需要进行重大重构。原始的
dict
中的值应该是
Foo
中的实例变量,新的dict是
id:Foo
。所以我的问题是没有意义的,但是很高兴知道我们不能使用字典的键来检索键。为什么不使用字符串
id
来检索值呢?它甚至比object
Bar
更轻。我还想使用一个键来检索一个键,而不是一个值。也许我的情况表明我的代码分解存在一些问题。查看我对Martjin答案的评论。已经看到了(发布此答案后)。我会小心地从字符串创建可变类,这在Python中是定义不变的。“从字符串创建可变类”-你的意思是什么,危险是什么?如果你从字符串继承,你的
Foo
将是一个字符串,但同时它将是可变的。这只是我的直觉,这不是一个好主意,我现在无法准确预见所有的含义,我只是看到可能有一些。因此,我宁愿寻找另一种解决方案(比如将id存储为成员),除非我有足够的时间和Python理解来分析它;o) 我的
Foo
继承自
object
,而不是
str
。字符串
id
已经是
Foo
的成员变量。