我正在创建一个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'
有什么建议吗?
答案 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)])}