对Python来说还算是新手,仍然需要大量的信息。
我所见过的所有关于字典的文档都说明了通过键获取值的各种方法-但我正在寻找一种反之的pythonic方法-通过值获取键。
我知道我可以遍历键并检查它们的值,直到找到要查找的值,然后抓住键,但是我正在寻找直接途径。
没有直接路线。但是,使用列表理解非常容易。
[k for k, v in d.iteritems() if v == desired_value]
如果您偶尔需要执行此操作,而又不建议将其编入索引,则不值得这样做,则可以执行以下操作:
class bidict(dict):
def key_with_value(self, value, default=None):
for k, v in self.iteritems():
if v == value:
return v
return default
def keys_with_value(self, value, default=None):
return [v for k, v in self.iteritems() if v == value]
然后d.key_with_value
会表现得像d.get
,相反。
您还可以创建一个自动为这两种方式建立索引的类。然后,键和值都需要是可哈希的。这是三种实现方式:
在两个单独的字典中,公开了一些类似字典的方法;你也许可以做foo.by_key[key]
或者做foo.by_value[value]
。(没有给出任何代码,因为它更复杂,而且我很懒,我认为无论如何这都不理想。)
在不同的结构,使你可以做d[key]
和d.inverse[value]
:
class bidict(dict):
def __init__(self, *args, **kwargs):
self.inverse = {}
super(bidict, self).__init__(key, value)
def __setitem__(self, key, value):
super(bidict, self).__setitem__(key, value)
self.inverse[value] = key
def __delitem__(self, key):
del self.inverse[self[key]]
super(bidict, self).__delitem__(key)
在相同的结构,所以,你可以做d[key]
和d[value]
:
class bidict(dict):
def __setitem__(self, key, value):
super(bidict, self).__setitem__(key, value)
super(bidict, self).__setitem__(value, key)
def __delitem__(self, key):
super(bidict, self).__delitem__(self[key])
super(bidict, self).__delitem__(key)
(明显地,a的这些实现中缺少bidict
该update
方法,该方法会稍微复杂一些(但help(dict.update)
将指示您需要涵盖的内容)。没有update
,bidict({1:2})
就不会做它打算做的事情,也不会做d.update({1:2})
。)
还考虑其他一些数据结构是否更合适。
我很难理解下面的代码是如何在字典中找到最大值的键的。我知道第一个参数返回键列表。但我没有得到第二个参数..帮帮我
问题内容: 我有以下字典 我想获取字典列表中每个字典值“ KA20”和“ KA23”的键“ tmst”的总和。 您能对此提出建议吗? 问题答案: 您可以使用: 请注意,要正常工作,必须按分组键进行排序:
在python中,我有以下输入: 输出-这3个人的所有食物组合: 主要的问题是我不知道每个人的人数和食物的数量,所以我猜这是递归的。
问题内容: 我有很简单的清单: 我如何求和所有 黄金 价值?我正在寻找不错的oneliner。 现在,我正在使用以下代码(但这不是最佳解决方案): 问题答案:
问题内容: 给定一个字典,我想提供一个函数。 有内置功能吗?还是我必须做 理想情况下,我只会写 要么 也就是说,对原始词典进行了突变还是创建副本对我来说都没有关系。 问题答案: 没有这样的功能;最简单的方法是使用dict理解: 在python 2.7中,请使用方法而不是节省内存。dict理解语法直到python 2.7才引入。 注意,列表上也没有这种方法。您将不得不使用列表推导或函数。 这样,您也
问题内容: 我有字典。 如何将的所有值提取到列表中? 问题答案: 如果你只需要字典的键,和使用:。 如果你只需要在字典中的值,和使用:。 如果您想同时使用键和值,请使用:返回一个元组列表。