Объедините все перестановки списков в словаре в python - PullRequest
1 голос
/ 08 февраля 2020

Учитывая исходный словарь

c = {'c': {'a':[1, 2, 3], 'b': [2, 3, 4]}}

Я хочу создать словарь, который имеет все возможные перестановки, без явного вызова индексов

Ожидаемый результат:

c = {'c0': {'a': 1, 'b': 2},
     'c1': {'a': 1, 'b': 3},
     'c2': {'a': 1, 'b': 4},
     'c3': {'a': 2, 'b': 2},
     'c4': {'a': 2, 'b': 3},
     'c5': {'a': 2, 'b': 4},
     'c6': {'a': 3, 'b': 2},
     'c7': {'a': 3, 'b': 3},
     'c8': {'a': 3, 'b': 4}}

То, что я пробовал (это не красиво, но сейчас я не могу думать прямо):

p = {}

for i, j in c.items():

  for k in j.keys():
    xxx = 0
    for v in j[k]:
      if i + str(xxx) in p.keys():
        p[i + str(xxx)][k] = v
      else:
        p[i + str(xxx)] = {}
        p[i + str(xxx)][k] = v
      xxx +=1

1 Ответ

0 голосов
/ 08 февраля 2020

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

from itertools import product as pt
c = {'c': {'a':[1, 2, 3], 'b': [2, 3, 4]}}
new_c = {f'{a}{i}':dict(zip(b.keys(), k)) for a, b in c.items() for i, k in enumerate(pt(*b.values()))}

Выход:

 {'c0': {'a': 1, 'b': 2}, 
  'c1': {'a': 1, 'b': 3}, 
  'c2': {'a': 1, 'b': 4}, 
  'c3': {'a': 2, 'b': 2}, 
  'c4': {'a': 2, 'b': 3}, 
  'c5': {'a': 2, 'b': 4}, 
  'c6': {'a': 3, 'b': 2}, 
  'c7': {'a': 3, 'b': 3}, 
  'c8': {'a': 3, 'b': 4}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...