如何将一个模块中的字典名称转置为另一个模块中的字典键?

2 投票
4 回答
662 浏览
提问于 2025-04-17 08:41

我有一组属于用户的值,这些值将作为某个函数的参数。我需要比较多个组,每个组都有自己的一套假设——大约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}

撰写回答