Как найти комбинации списков из вложенных словарей - PullRequest
0 голосов
/ 14 октября 2018

Рассмотрим вложенный словарь:

d1 = {'key': {'r1': [1,2,3],
              'r2': [5,6]} }

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

ans = [ {'root': 'key', 'r1': 1, 'r2':5},
        {'root': 'key', 'r1': 1, 'r2':6},
        {'root': 'key', 'r1': 2, 'r2':5},
        {'root': 'key', 'r1': 2, 'r2':6},
        {'root': 'key', 'r1': 3, 'r2':5},
        {'root': 'key', 'r1': 3, 'r2':6}
      ]

Я могу сделать это вручную для вышеприведенного примера, но проблема в том, что количество ключей, кроме «root» в d1, может быть любымномер переменной и мой ответ изменится, например, рассмотрим:,

d2 = {'key': {'r1': [1,2,3],
              'r2': [5,6],
              'r3': [7,8]}
     }

Теперь ответ будет выглядеть следующим образом:

ans = [ {'root': 'key', 'r1': 1, 'r2':5, 'r3':7},
        {'root': 'key', 'r1': 1, 'r2':6, 'r3':8},
        {'root': 'key', 'r1': 2, 'r2':5, 'r3':7},
        {'root': 'key', 'r1': 2, 'r2':6 ,'r3':8},
        .
        .(total 12 combinations)
      ]

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

from itertools import product
list(product(d1['key']['r1'], d1['key']['r2']))

возвращает:

[(1, 5), (1, 6), (2, 5), (2, 6), (3, 5), (3, 6)]

Но как я могу добавить соответствующие ключи к каждому из этих элементов и как я могу сделать это динамически?

1 Ответ

0 голосов
/ 14 октября 2018

Пока «корень» неизменен, вы можете использовать itertools.product и zip каждый продукт с ключами словаря:

>>> from itertools import product
>>> combinations = product(*d2['key'].values())
>>> [{'root': 'key', **dict(zip(d2['key'].keys(), c))} for c in combinations]   

[{'r1': 1, 'r2': 5, 'r3': 7, 'root': 'key'},
 {'r1': 1, 'r2': 5, 'r3': 8, 'root': 'key'},
 {'r1': 1, 'r2': 6, 'r3': 7, 'root': 'key'},
 {'r1': 1, 'r2': 6, 'r3': 8, 'root': 'key'},
 ...

К счастью,dict.keys() и dict.values() возвращают ключи и значения в соответствующем порядке, независимо от вашей версии Python, это гарантируется спецификацией.

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