如何将一个模块中的字典名称转置为另一个模块中的字典键?
我有一组属于用户的值,这些值将作为某个函数的参数。我需要比较多个组,每个组都有自己的一套假设——大约80%的时候,它们会有一些共同的变量(虽然具体的值可能不同)。
我会比添加新用户更频繁地添加新变量,所以我更想把每个变量的数据打包成一个字典。
我该如何遍历这些假设数据,以便为特定用户编制一个字典呢?
换句话说,从这里:
assumptions.py
var_x = {'user_1': 10, 'user_2': 15, 'user_3': 12}
var_y = {'user_1': 1000, 'user_3': 950} # nothing for user_2
var_z = {'user_1': 3, 'user_2': 2, 'user_3': 3}
到这里:
foobar.py
user = 'user_2'
<transpose>
user_dict = {'var_x':15, 'var_y':None, 'var_z':2}
任何建议都非常感谢。谢谢。
4 个回答
1
这里有一种方法可以把多个字典连接在一起(一个是默认值,另一个是更新后的假设):
import UserDict
class Chainmap(UserDict.DictMixin):
"""Combine multiple mappings for successive lookups.
For example, to emulate Python's normal lookup sequence:
import __builtin__
pylookup = Chainmap(locals(), globals(), vars(__builtin__))
"""
def __init__(self, *maps):
self._maps = maps
def __getitem__(self, key):
for mapping in self._maps:
try:
return mapping[key]
except KeyError:
pass
raise KeyError(key)
def keys(self):
result = []
seen = set()
for mapping in self_maps:
for key in mapping:
if key not in seen:
result.append(key)
seen.add(key)
return result
如果你想要更完整的字典接口,可以查看 init.py#l754
ChainMap 类可以这样使用:
base_assumptions = dict(a1=10, a2=15, a3=30)
class FundClass:
def __init__(self, fund, investor_assumptions) #dict to be unpacked via '**' when passed
combined_dict = ChainMap(investor_assumptions, base_assumptions)
self.some_var = combined_dict['a1']
1
我觉得你需要的就是来自 collections
模块的 defaultdict
。
下面是一个例子:
from collections import defaultdict
# you must use `lambda` here as using just `None` will result with
# KeyError on undefined keys
fund_dict = defaultdict(lambda: None, {'assume01':15, 'assume03':2})
print fund_def['assume01'] # outputs 15
print fund_def['assume02'] # outputs None
print fund_def['assume03'] # outputs 2
0
在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或库的时候。这些问题可能会让我们感到困惑,不知道该怎么解决。比如,有人可能在使用一个特定的功能时,发现它并没有按照预期工作。这种情况很常见,尤其是对于刚开始学习编程的人来说。
通常,解决这些问题的方法是仔细检查代码,看看有没有拼写错误,或者参数设置是否正确。有时候,查阅相关的文档或在网上搜索类似的问题也能找到答案。
总之,遇到问题时不要着急,慢慢分析,通常都能找到解决办法。
assumptions = {'assume01': {'fund1':10, 'fund2':15, 'fund3':12},
'assume02': {'fund1':1000, 'fund3':950},
'assume03': {'fund1':3, 'fund2':2, 'fund3':3}}
def fund_assumptions(fund):
return dict((k, assumptions[k].get(fund)) for k in assumptions)
print fund_assumptions('fund2')
#prints {'assume02': None, 'assume03': 2, 'assume01': 15}