根据另一个值“state”生成json对象的变体内部值

2024-06-02 06:09:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要生成一个json,类似于:

'alpha' : {
  "impro": 10,
  "axdo": 20,
  "sendo": 14 
} 
'beta' : {
  "tero": 90,
  "dote": 10,
  "sendo": 14 
} 

次键(“impro”)的值有3种状态:正常、警告、危险。你知道吗

states = ['normal', 'warning', 'danger']

我在考虑使用类:

 class Alpha:
   def __init__(self):
     keys = ['impro', 'axdo', 'sendo']
     state = random.choice(states) 
     for k,v in keys.iteritems():
        setattr(self, k, generate_value(state=state))

generate_value是基于传递的state生成值的函数。你知道吗

我需要创建足够多的随机Alpha对象,确保每个次键都处于所有3种状态。你知道吗


Tags: selfalphajsonvalue状态keysgeneratebeta
1条回答
网友
1楼 · 发布于 2024-06-02 06:09:43

我希望我正确地理解了这个问题。对象Alpha的每个值都是从属于三个区间(normalwarningdanger)的值中选择的。我使用产品生成所有组合:

import random
from itertools import product, cycle
import json

class Alpha:
    keys = ['impro', 'axdo', 'sendto']
    values = {'normal':(0, 100), 'warning':(200, 300), 'danger': (400, 500)}

    def __init__(self):
        pass

    def __repr__(self):
        return 'Alpha(impro={},axdo={},sendto={})'.format(self.impro, self.axdo, self.sendto)

class MyEncoder(json.JSONEncoder):
        def default(self, o):
            return o.__dict__


def generate_objects(cls):
    for p in zip(cycle([cls.keys]), product(cls.values.keys(), repeat=len(cls.keys))):
        c = cls()
        for k, v in zip(*p):
            rand_val = random.randint(*cls.values[v])
            setattr(c, k, rand_val)
        yield c

for alpha in generate_objects(Alpha):
    print(json.dumps({'alpha': alpha}, cls=MyEncoder, indent=4))

印刷品:

{
    "alpha": {
        "impro": 42,
        "axdo": 24,
        "sendto": 96
    }
}
{
    "alpha": {
        "impro": 75,
        "axdo": 57,
        "sendto": 210
    }
}
{
    "alpha": {
        "impro": 11,
        "axdo": 62,
        "sendto": 478
    }
}

... and so on.

相关问题 更多 >