如何在键值对dict中获得键值的关键值

时间:2018-05-03 22:10:58

标签: python

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

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

2 个答案:

答案 0 :(得分:0)

数字背后有什么意义吗?

SELECT GREATEST(NULL,NOW());

输出:

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

答案 1 :(得分:0)

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

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

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的元素,其中追加键被添加到元素,但只有在返回它们时。

使用这种方法,您不会将键存储在值内,它会保持概念分离不变。

您可以在普通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)

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