У меня есть Python dict следующим образом:

test = {"a": value_of_a,"b": value_of_b, "c": value_of_c}

Где value_of_a, value_of_b, value_of_c - все переменные, которые могут принимать 3 значения:

  • 1,2 или 3 для value_of_a

  • «a», «b» или «c» для value_of_b,

  • 45 180 250 для vaulue_of_c

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

test1 = {"a" : 2, "b" : "a", "c" : 45 }
test2 = {"a" : 3, "b" : "a", "c" : 45 }

И так далее...

У меня нет идеи, как мне решить эту проблему?

ПРИМЕЧАНИЕ. Эти значения предназначены только для упрощения задачи, исходная задача имеет больше ключей и значений для каждого, но если я смогу сделать это для них, то в этом тривиальном примере я могу сделать это для своей исходной задачи.

3
Anis Souames 7 Янв 2017 в 19:17

3 ответа

Лучший ответ

Я рекомендую использовать специальные itertools.combination. Пожалуйста, посмотрите на примеры внизу страницы - здесь есть несколько интересных случаев.

>>> import itertools

>>> list(itertools.combinations([1,2,3], 2))
[(1, 2), (1, 3), (2, 3)]
3
Eugene Lisitsky 7 Янв 2017 в 17:02

Пожалуйста, укажите, хотите ли вы все возможные комбинации или случайно выбранные элементы из списков значений. Если вы хотите каждую комбинацию, используйте решение @Eugene Litsisky. Если вы ищете набор словарей со значениями, случайно взятыми из списков значений, вы можете использовать numpy.random.choice.

import numpy as np

test1 = {'a': np.random.choice(value_of_a),
         'b': np.random.choice(value_of_b),
         'c': np.random.choice(value_of_c)}
1
3novak 7 Янв 2017 в 16:28

Наслаждаться:

import itertools


def iterate_values(S):
    keys, values = zip(*S.items())

    for row in itertools.product(*values):
        yield dict(zip(keys, row))


S = {"a": [1, 2, 3], "b": ["a", "b", "c"], "c": [45, 180, 250]}

for d in iterate_values(S):
    print(d)

Результат:

{'a': 1, 'c': 45, 'b': 'a'}
{'a': 1, 'c': 45, 'b': 'b'}
{'a': 1, 'c': 45, 'b': 'c'}
{'a': 1, 'c': 180, 'b': 'a'}
{'a': 1, 'c': 180, 'b': 'b'}
{'a': 1, 'c': 180, 'b': 'c'}
{'a': 1, 'c': 250, 'b': 'a'}
{'a': 1, 'c': 250, 'b': 'b'}
{'a': 1, 'c': 250, 'b': 'c'}
{'a': 2, 'c': 45, 'b': 'a'}
{'a': 2, 'c': 45, 'b': 'b'}
{'a': 2, 'c': 45, 'b': 'c'}
{'a': 2, 'c': 180, 'b': 'a'}
{'a': 2, 'c': 180, 'b': 'b'}
{'a': 2, 'c': 180, 'b': 'c'}
{'a': 2, 'c': 250, 'b': 'a'}
{'a': 2, 'c': 250, 'b': 'b'}
{'a': 2, 'c': 250, 'b': 'c'}
{'a': 3, 'c': 45, 'b': 'a'}
{'a': 3, 'c': 45, 'b': 'b'}
{'a': 3, 'c': 45, 'b': 'c'}
{'a': 3, 'c': 180, 'b': 'a'}
{'a': 3, 'c': 180, 'b': 'b'}
{'a': 3, 'c': 180, 'b': 'c'}
{'a': 3, 'c': 250, 'b': 'a'}
{'a': 3, 'c': 250, 'b': 'b'}
{'a': 3, 'c': 250, 'b': 'c'}

Я реализовал это как генератор, потому что это экономит вашу память. Если вам нужен точный список, вы можете сделать это:

lst = list(iterate_values(S))
4
Fomalhaut 7 Янв 2017 в 16:55