python字典,指定其总和为特定值的随机值

时间:2016-11-15 23:20:37

标签: python dictionary random

我正在创建一个python程序,其中生成 n 次的随机值,以用作模型模拟的参数值。

我有一个定义每个参数边界的字典,例如:

parameters = {'A': random.uniform(1,10), 'B': random.uniform(20,40)}

我想添加一些参数,其总和必须为1,如:

params = {'C1': random.uniform(0.0,1.0), 'C2': 1 - params['C1']}

后者显然无法产生KeyError: 'C1'

我也尝试过这样的事情:

params = {'A': random.uniform(1,10), 'B': random.uniform(20,40), 'C': {'C1': None,'C2': None}}

def class_fractions():
    for key in params['C']:
        if key == 'C1':
            params['C'][key] = random.uniform(0.0,1.0)
        if key == 'C2':
            params['C'][key] = 1.0 - params['C'][key]

但在调用函数后我得到TypeError

TypeError: unsupported operand type(s) for -: 'float' and 'NoneType'

有什么建议吗?

3 个答案:

答案 0 :(得分:2)

您的代码存在的问题是因为for key in params['C'] 未在Python中排序。当你这样做时:

C2

您获得C1之前的密钥dict。实际上你甚至不需要在dict中迭代def class_fractions(): params['C']['C1'] = random.uniform(0.0,1.0) params['C']['C2'] = 1.0 - params['C']['C1'] 简单设置的值,如:

params = {'A': random.uniform(1,10), 'B': random.uniform(20,40)} # create partial dict
c_dict = {'C1': random.uniform(1,10)}  # create sub-dict to store random value
c_dict['C2'] = 1 - c_dict['C1']  # get value that you want
params['C'] = c_dict       # add entry into parent dict

哟甚至不需要单独的功能,因为它只更新相同的字典,只需按照以下方式执行:

<input type="radio" class="px" name="radiochoice" id="radio7" class="radio" value="185.00"  <?php if($_POST['radiochoice'] =='185.00'){echo "checked='checked'";} ?>/>

答案 1 :(得分:1)

从你使用for循环看起来你可能真的有更多的参数,而不仅仅是两个。在这种情况下,您可以生成一个填充了随机数的值列表,然后将其缩放为一,as described in this other answer。然后迭代字典键和列表项的压缩视图,并将项目分配给字典。

或者,直接在字典上操作:

params = {k: random.uniform(0, 1) for k in ('C1', 'C2', 'C3')}
total = sum(params.values())
params = {k: (v / total) for k, v in params.items()}

答案 2 :(得分:1)

如果你真的想要不使用你的class_fraction,并立即初始化params,那么需要使用OrderDict:

import random
from collections import OrderedDict

params = {'A': random.uniform(1,10), 'B': random.uniform(20,40), 'C':OrderedDict([('C1', None),('C2', None)])}


def class_fractions():
    for key in params['C']:
        if key == 'C1':
            params['C'][key] = random.uniform(0.0,1.0)
        if key == 'C2':
            params['C'][key] = 1.0 - params['C']['C1']


class_fractions()
print(params)

结果:

{'B': 37.3088618142464, 'A': 2.274415152225316, 'C': OrderedDict([('C1', 0.12703200100786471), ('C2', 0.8729679989921353)])}