2

我有一组属于用户的值,它们将成为给定函数的参数。我将比较多个组,每个组都有自己的一组假设——大​​约 80% 的时间它们将是公共变量(尽管不是值本身)。

我将比新用户更频繁地添加新变量,因此我宁愿将数据捆绑为每个变量的字典。

我怎样才能最好地遍历假设数据来为给定用户编译字典?

换句话说,从这里开始:

假设.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}

到这里:

foob​​ar.py

user = 'user_2'
<transpose>
user_dict = {'var_x':15, 'var_y':None, 'var_z':2}

任何建议将不胜感激。谢谢。

4

4 回答 4

1

我认为defaultdictcollections模块中是您正在寻找的。

这是一个例子

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
于 2011-12-20T07:21:58.993 回答
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">http://hg.python.org/cpython/file/ab5d39caad6f/Lib/collections/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']
于 2011-12-20T07:26:56.443 回答
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}
于 2011-12-20T14:32:27.240 回答
0

假设假设与您的脚本位于同一目录中

import assumptions
fund = "..."
fund_dict = {}
for d in dir(assumptions):
    element = eval("assumptions." + d)
    if isinstance(element, dict) and d[6:] == "assume": # in case there are other dictionaries in the file
        if fund in element:
            fund_dict[d] = element[fund]
        else:
            fund_dict[d] = None

# using your example:
# print fund_dict prints {'assume01': 15, 'assume02': None, 'assume03': 2}
于 2011-12-20T17:21:31.380 回答