我有一本这样的清单的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的平均值,否则将s进行比较;
重复此过程10,000次
返回False大于m平均值的时间百分比。


输出应如下所示:

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

最佳答案

我会使用列表理解,它实际上是选择一个随机值并将其与均值进行比较。这将产生一个True / False列表。如果您取其平均值,则将平均一个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}

关于python - 如何创建一个函数(迭代/递归)以在Python中的元组字典上运行?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26239940/

10-12 12:47
查看更多