Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何创建一个函数(迭代/递归)来运行Python中的元组字典?_Python_Function_Recursion_Dictionary_Iteration - Fatal编程技术网

如何创建一个函数(迭代/递归)来运行Python中的元组字典?

如何创建一个函数(迭代/递归)来运行Python中的元组字典?,python,function,recursion,dictionary,iteration,Python,Function,Recursion,Dictionary,Iteration,我有一个类似于以下列表的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) 从l中随机抽取长度为len(t)的替换样本s 如果m大于s的平均值,则将m与s的平均值进行比较,否则为False 重复此过

我有一个类似于以下列表的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
  • l
    中随机抽取长度为
    len(t)
    的替换样本
    s
  • 如果
    m
    大于
    s
    的平均值,则将
    m
    s
    的平均值进行比较,否则为
    False
  • 重复此过程10000次
  • 返回
    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

我将使用一个列表理解,本质上选择一个随机值,并将其与平均值进行比较。这将生成一个正确/错误列表。如果你取它的平均值,它将平均一个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}

请注意,您应该与
len(tup)
-length
sample
的平均值进行比较:“此随机样本的长度与tuple的第一个值的长度相同。”如果我理解了原始问题,我认为我编写它的方式是正确的。这个问题的确定性答案将产生
{'A':0.6,'B':0.2,'C':0.2}
,这与上述代码产生的概率答案相对接近。@如果样本是替换的,那么您有可能选择(1,1,1)Gotcha!好了,我现在明白问题了,我相应地编辑了代码。