您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

从Python字典中的值中查找键:

从Python字典中的值中查找键:

没有直接路线。但是,使用列表理解非常容易。

[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的这些实现中缺少bidictupdate方法,该方法会稍微复杂一些(但help(dict.update)将指示您需要涵盖的内容)。没有updatebidict({1:2})就不会做它打算做的事情,也不会做d.update({1:2})。)

还考虑其他一些数据结构是否更合适。

python 2022/1/1 18:45:41 有301人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶