【问题标题】:How to create a function (Iteration/Recursion) to run over a dictionary of tuples in Python?如何创建一个函数(迭代/递归)来运行 Python 中的元组字典?
【发布时间】:2014-12-02 02:41:42
【问题描述】:

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

【问题讨论】:

    标签: python function recursion dictionary iteration


    【解决方案1】:

    我会使用一个列表推导,它本质上选择一个随机值并将其与平均值进行比较。这将产生一个真/假列表。如果您取平均值,它将对 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 的平均值进行比较:"此随机样本的长度与第一个值的长度相同元组。”
    • 如果我理解了最初的问题,我认为我写它的方式是正确的。这个问题的确定性答案将产生{'A': 0.6, 'B': 0.2, 'C': 0.2},这与上述代码产生的概率答案相对接近。
    • @Cyber​​ 如果样本是带替换的,您有机会选择 (1, 1, 1)
    • 明白了!好的,我现在明白了问题所在,我相应地编辑了我的代码。
    猜你喜欢
    • 2022-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-29
    • 2020-12-11
    • 1970-01-01
    • 2017-06-25
    • 2012-10-17
    相关资源
    最近更新 更多