2011-12-20 97 views
2

我有一組屬於用戶的值,它們將作爲給定函數的參數。我會比較多個小組,每個小組都有他們自己的一套假設 - 大約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} 

任何意見將b非常感謝。謝謝。

回答

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} 
+0

這是一種流暢的方法。我唯一擔心的是它是否可擴展而無需直接編輯文件。經常彈出新的「承擔......」變量,我需要添加。我對編程還很陌生,但我希望將這個「假設」模塊加入到GUI環境中進行假設編輯,我不知道是否讓字典中嵌入的字典會影響這種能力。雖然會嘗試。非常感謝。 – hommel 2011-12-20 18:47:15

+0

@DolphinTsar分離數據和程序邏輯是很好的。假設是數據,但變量定義是程序邏輯的一部分 – 2011-12-21 06:55:43

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 
+0

爲什麼'defaultdict'? – Blender 2011-12-20 07:26:52

+0

@Blender我用示例代碼更新了我的答案 – lig 2011-12-20 07:30:40

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'] 
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} 
+0

啊!這就是我一直在努力的。我被捕獲試圖通過'module.object'方法引用假設模塊,但沒有使用'eval',因此出現了一個錯誤,即在「假設」中找不到迭代變量。當我回家時會嘗試。謝謝! – hommel 2011-12-20 18:42:32

相關問題