Создать объекты класса со словарем в качестве аргумента - PullRequest
1 голос
/ 05 марта 2020

В следующем примере я создал класс 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,
            })

работает как положено. Для instace:

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

, но, конечно, это не работает. Есть предложения?

1 Ответ

1 голос
/ 09 марта 2020

Если я правильно понимаю, вы хотите создать продукт по заданным спискам. Если это так, вы можете использовать товары Python из itertools. Код ниже использует 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})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...