首页 > 解决方案 > 如何在键值对dict中获取键的值

问题描述

这是一个奇怪的问题,但我想知道是否可以在 python 中构建一个值包含键值对中的键的字典。如下,我想通过从实例的键值对中替换重复的客户产品动物的值来重写以下类SwitchTest 。我怎样才能做到这一点?或者更具体地说,如何在字典中获取键的值?

class Product():
    def __init__(self, para):
        self.para = para
        .....

class Animal():
    def __init__(self, para):
        self.para = para
        ....

class Human():
    def __init__(self, para):
        self.para = para
        ....


class SwitchTest():
    def __init__(self):
        instance = {'customer': lambda x: setattr(SwitchTest, 'customer', Human(x)),
                      'product': lambda x: setattr(self, 'product', Product(x)),
                      'animal': lambda x: setattr(self, 'animal', Animal(x))}

标签: python

解决方案


我不太明白您为什么要将密钥也存储在值中。这违背了字典的概念。

相反,如果您只是在返回值时将键添加到值中,那么您将拥有一些自定义字典:

users = c_dict(
a = ('user', 'address', 987),
# ...
)

获得值后将键添加到 return

In [32]: users['a']
Out[32]: ('user_a', 'address_a', 987)

要实现这一点,您可以仅继承dict和覆盖__getitem__方法

class c_dict(dict):
    def __getitem__(self, key):
        val = super(c_dict, self).__getitem__(key)
        if isinstance(val, tuple):
            return tuple(
                '{0}_{1}'.format(el, key) 
                if isinstance(el, str) 
                else el 
                for el in val
                )
        else:
            return val

这个自定义字典 ​​,c_dict将表现得像一个普通字典,除非你得到一个 type 的值,该值tuple包含str其中追逐键被添加到元素但仅在返回它们时才添加的类型元素。

使用这种方法,您无需将键存储在值中,而是保持概念分离完好无损。

dict您可以轻松地在 normal和 this custom之间切换c_dict。因此,如果您想摆脱这种特殊的返回值的方式,只需执行users = dict(users)并且users再次是一个简单的dict. 这两种方式都有效:

In [41]: users = {'a': ('user', 'address', 12)}
In [42]: users['a']
Out[42]: ('user', 'address', 12)
In [43]: users = c_dict(users)
In [44]: users['a']
Out[44]: ('user_a', 'address_a', 12)
In [45]: users = dict(users)
In [46]: users['a']
Out[46]: ('user', 'address', 12)

希望有帮助。快乐编码!


推荐阅读