如何在keyvalue对di的value中获取key的值

2024-05-16 03:23:48 发布

您现在位置:Python中文网/ 问答频道 /正文

这是一个奇怪的问题,但我想知道是否有可能在python中构建一个包含key-in-key-value对的dict。下面,我想重写下面的类SwitchTest,用replace-duplicatedcustomerproductanimal替换实例键值对中的value。我该怎么做?或者更具体地说,如何在字典中的value中获取key的值?你知道吗

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))}

Tags: lambdakeyselfinitvaluedefproductclass
2条回答

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

如果您只是在返回值时将键添加到值中,这样您就有了一些自定义的dict:

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

在获得值后,将键添加到返回中:

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的行为将与普通词典类似,除非您获得一个tuple类型的值,该值包含str类型的元素,在该类型中,chase键被添加到元素中,但仅在返回它们时才执行。你知道吗

使用这种方法,您不必将键存储在值中,它可以保持概念上的分离完好无损。你知道吗

您可以轻松地在普通dict和此自定义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)

希望这有帮助。快乐的编码!

数字背后有什么意义吗?你知道吗

initial_dict = {'a': 987, 'b': 18, 'c': 9, 'd': 87}
users = {k: ('user_{}'.format(k),'address_{}'.format(k), v) for k, v in initial_dict.items()}

输出:

{'a': ('user_a', 'address_a', 987),
 'b': ('user_b', 'address_b', 18),
 'c': ('user_c', 'address_c', 9),
 'd': ('user_d', 'address_d', 87)}

相关问题 更多 >