2014-10-07 27 views
2

我有名單的這樣一個Python字典:如何創建一個函數(迭代/遞歸)在Python中的元組字典上運行?

d = {'A': [(4, 4, 3), [1, 2, 3, 4, 5]], 
    'B': [(2, 1, 2), [5, 4, 3, 2, 1]], 
    'C': [(4, 1, 1), [2, 4, 1, 2, 4]]} 

我需要創建一個訪問該詞典的元素的公式,併爲每個值[t, l]

  • 計算的平均t(我們稱之爲m);
  • 採取隨機樣本s,替換長度爲len(t),從l;
  • 比較ms平均 - True如果m大於sFalse否則意味着更大;
  • 重複此過程10,000次
  • 返回的時間百分比m大於平均值s

輸出應該是這樣的:

In [16]: test(d) 
Out[16]: {'A': 0.5, 'B': 0.9, 'C': 0.4} 

我覺得我不是一個答案,截至目前,這是我曾嘗試:

def test(dict): 
    def mean_diff(dict): 
     for k, (v0, v1) in dict.iteritems(): 
      m = np.mean(v0) > (np.mean(npr.choice(v1, size=(1, len(v0)), replace=True))) 
      return ({k: m}) 
    for k, (v0, v1) in dict.iteritems(): 
     bootstrap = np.array([means_diff(dict) for _ in range(10000)]) 
     rank = float(np.sum(bootstrap))/10000 
     return ({k: rank}) 

但是,我得到:

RuntimeError: maximum recursion depth exceeded while calling a Python object 

回答

2

我會用一個列表理解,基本上選擇隨機值和COMPA回到平均水平。這將產生真/假的列表。如果你採取這種意思,它將平均1和0的列表,所以它會給你總概率。

import numpy as np 

d = {'A': [(4, 4, 3), [1, 2, 3, 4, 5]], 
    'B': [(2, 1, 2), [5, 4, 3, 2, 1]], 
    'C': [(4, 1, 1), [2, 4, 1, 2, 4]]} 

def makeRanks(d): 
    rankDict = {} 
    for key in d: 
     tup = d[key][0] 
     mean = np.mean(tup) 
     l = d[key][1] 
     rank = np.mean([mean > np.mean(np.random.choice(l,len(tup))) for _ in range(10000)]) 
     rankDict[key] = rank 
    return rankDict 

測試

>>> makeRanks(d) 
{'C': 0.15529999999999999, 'A': 0.72130000000000005, 'B': 0.031899999999999998} 
+0

請注意,您應該比作'LEN(TUP)的平均'' - 長度sample':*「這個隨機抽樣的長度是一樣的這個元組的第一個值的長度。「* – jonrsharpe 2014-10-07 15:54:46

+0

如果我理解了原始問題,我認爲我寫它的方式是正確的。對這個問題的確定性答案會產生'{'A':0.6,'B':0.2,'C':0.2}',這與上述代碼產生的概率答案相當接近。 – CoryKramer 2014-10-07 15:58:28

+0

@Cyber​​如果樣品採取替換,有一個機會,你選擇(1,1,1) – hernanavella 2014-10-07 16:11:42