python - 如何在键值对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))}
解决方案
我不太明白您为什么要将密钥也存储在值中。这违背了字典的概念。
相反,如果您只是在返回值时将键添加到值中,那么您将拥有一些自定义字典:
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)
希望有帮助。快乐编码!
推荐阅读
- python - 如何从 for 循环中创建绘图
- ajax - 为什么 AJAX 调用得到 0 但 PHP 函数工作正常?
- serilog - 将 TLS 与 Serilog.Sinks.Email 一起使用?
- c# - 错误的请求数据:“带有‘连接:升级’的请求不能在请求正文中包含内容。” 向 APi 发出 POST 请求时
- c# - 将 C# COM dll 移植到 Linux
- python - 如果我在数据框对象上嵌套了 if else,我应该使用哪种方法
- mysql - 没有数据返回时使用 IFNULL()
- ios - Fairplay 停止在 iOS 12.4 和 13 上运行
- google-apps-script - 如何将 gmail 附件中的大数据 CSV 复制到谷歌表格中?
- javascript - 如何从javascript中的数组中删除对象?