使用字典作为参数创建类对象

2024-10-04 01:24:13 发布

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

在下一个示例中,我创建了一个类Sample,它接受关键字参数字典,如:

import numpy as np

class Sample:
    def __init__(self, **kwargs):
        self.A = kwargs['A']
        self.B = kwargs['B']
        self.C = kwargs['C']
        self.D = kwargs['D']
        self.E = kwargs['E']
        self.F = kwargs['F']
        self.G = kwargs['G']

以及创建类对象列表的函数,如:

def createSampleList (As, Bs, Cs, **kwargs):
    sampleList = []
    for A in As:
        for B in Bs:
            for C in Cs:
                addedkwargs = {'A': A, 'B': B, 'C': C}
                kwargs = dict(kwargs,**addedkwargs)
                sampleList.append (Sample (**kwargs))
    return sampleList

到目前为止,如果我像定义中那样给它一个位置参数列表,那么这个函数工作得很好,因此

As = np.linspace (0, 3, 3)
Bs = np.linspace (0, 3, 4)
Cs = np.linspace (0, 3, 6)
D = 3
E = 5
F = 8
G = 9

sampleList = createSampleList (
                As, Bs, Cs, **{
                'D' : D,
                'E' : E,
                'F' : F,
                'G' : G,
            })

一切正常。对于Instance:

print(len(sampleList))
>>> 72

现在,我希望能够使用关键字参数可变长度的字典调用函数createSampleList。说:

sampleList = createSampleList2 (
                {'A': As, 'B': Bs, 'C': Cs, 'D' : D }, **{
                    'E' : E,
                    'F' : F,
                    'G' : G,
            })

我试过类似的东西

def createSampleList2 (arrayDict, **kwargs):
    sampleList = []
    addedkwargs = dict()
    for key in arrayDict.keys():
        for value in arrayDict[key]:
            addedkwargs[key]= value
    kwargs = dict(kwargs,**addedkwargs)
    sampleList.append (Sample (**kwargs))
    return sampleList

当然,这是行不通的。有什么建议吗


Tags: sampleinselffor参数bsdefas
1条回答
网友
1楼 · 发布于 2024-10-04 01:24:13

如果我理解正确,您想要的是创建给定列表的产品。如果是这样,您可以使用来自itertools的Python产品。下面的代码使用itertools.product生成列表值的所有可能组合。为了使事情更简单,不可编辑(例如简单数字)被替换为一项长列表:

from itertools import product

def createSampleList2(array_dict, **kwargs):
    sample_list = []
    keys = []
    values = []
    for k, v in array_dict.items():
        keys.append(k)
        try:
            iter(v)
            values.append(v)
        except TypeError:
            values.append([v])

    for value_set in product(*values):
        kw = dict(zip(keys, value_set))
        kw.update(kwargs)
        sample_list.append(Sample(**kw))
    return sample_list

此函数将接受array_dict中的值和列表的任意组合。因此,以下所有内容都是等效的:

createSampleList2({"A": [1, 2], "B": [3, 4], "C": [5, 6]}, D=7, E=8, F=9, G=10)
createSampleList2({"A": [1, 2], "B": [3, 4], "C": [5, 6], "D": 7, "E": 8, "F": 9, "G": 10})

相关问题 更多 >