Создание подмножества элементов dict, имеющих {key: list []} - PullRequest
0 голосов
/ 21 марта 2020

У меня есть дикт с элементами списка для каждого ключа. например.

config_dict = {"num":[2,3,4],
               "dist":[10,30,22],
               "type":["free"],
               "uphill":[1e-3, 1e-2, 1e-6]
               }

Я хочу создать функцию, которая создает все возможные подмножества элементов для каждого ключа в качестве нового dict. Например,

new_config = {'congfig_1': { "num":2,
                             "dist":22,
                             "type":"free",
                             "uphill":1e-3
                           }
              'config_2': { "num":3,
                             "dist":22,
                             "type":"free",
                             "uphill":1e-6
                           }
              'config_3': { "num":2,
                             "dist":10,
                             "type":"free",
                             "uphill":1e-3
                           }
               ...
              }

Я застрял в реализации, поскольку каждый ключ может иметь разную длину списков. Есть ли элегантный способ сделать это / pythoni c без большого количества циклов?

Ответы [ 3 ]

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

Вы можете использовать itertools.product:

from itertools import product

config_dict = {"num":[2,3,4],
               "dist":[10,30,22],
               "type":["free"],
               "uphill":[1e-3, 1e-2, 1e-6]
               }

output = {f'config_{i}': {'num': num, 'dist': dist, 'type': type, 'uphill': uphill}
         for i, (num, dist, type, uphill) in enumerate(product(*config_dict.values()), 1)}

print(output)

Однако, может иметь смысл создать список словарей вместо этого:

output = [{'num': num, 'dist': dist, 'type': type, 'uphill': uphill}
          for (num, dist, type, uphill) in product(*config_dict.values())]
0 голосов
/ 21 марта 2020

Добавление к ответу @DeepSpace. Мы можем предотвратить явный ввод ключей при создании этого нового слова путем

config_keys = config_dict.keys()
for i, values in product(*config_dict.values()):
   output[f'config_{i}'] = dict(zip(config_keys, values))
.
0 голосов
/ 21 марта 2020

Если вы хотите писать без библиотек

def combinatrix(dictLeft):
    sol=list()
    key=list(dictLeft.keys())[0]
    temp2=dict(dictLeft)
    del temp2[key]
    if(len(temp2)==0):
        for item in dictLeft.get(key):
            temp=dict()
            temp[key]=item
            sol.append(temp)
    else:
        a=combinatrix(temp2)
        for item in dictLeft.get(key):
            for b in a:
                b=dict(b)
                b[key]=item
                sol.append(b)
    return sol

config_dict = {"num":[2,3,4],
               "dist":[10,30,22],
               "type":["free"],
               "uphill":[1e-3, 1e-2, 1e-6]
               }

sol=combinatrix(config_dict)
print(sol)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...