Создайте один словарь для каждой комбинации значений списка в словаре - PullRequest
0 голосов
/ 02 декабря 2018

У меня есть следующий словарь:

my_dict = {"A":0, "B":[1,2], "C":3}

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

#Desired result
[{"A":0, "B":1, "C":3}, {"A":0, "B":2, "C":3}]

Я могу получить список каждого необходимого словаря, в надежде, что затем смогу пройтись по списку и объединить словари, используя update().Это перезапишет ключ "B" и создаст только один дикт.

Вот что я сделал:

dict_list = []
my_dict = {"A":0, "B":[1,2], "C":3}

for k, v in my_dict.items():
    if type(v) == list:
        for i in v:
            dict1 = {k:i}
            dict_list.append(dict1)
    if type(v) != list:
        dict2 = {k:v}
        dict_list.append(dict2)

new_dict = {}
for d in dict_list:
    new_dict.update(d)

print(new_dict)

Вывод:

{'A':0, 'B':2, 'C':3}

Это перезаписывает ключ 'B' и создает только один словарь на основе последнегозначение.

1 Ответ

0 голосов
/ 02 декабря 2018

Довольно просто, если у вашего дикта может быть только один список.

>>> my_dict = {"A":0, "B":[1,2], "C":3}
>>> k, lst = next((k, v) for k, v in my_dict.items() if isinstance(v, list))
>>> [{**my_dict, k:x} for x in lst]
[{'A': 0, 'B': 1, 'C': 3}, {'A': 0, 'B': 2, 'C': 3}]

Немного сложнее, если у вашего дикта может быть несколько списков.

>>> from itertools import product
>>> 
>>> my_dict = {"A":0, "B":[1,2], "C":[3, 4]}
>>> lists_kv = ([(k, x) for x in v] for k, v in my_dict.items() if isinstance(v, list))
>>> [{**my_dict, **dict(x)} for x in product(*lists_kv)]
[{'A': 0, 'B': 1, 'C': 3},
 {'A': 0, 'B': 1, 'C': 4},
 {'A': 0, 'B': 2, 'C': 3},
 {'A': 0, 'B': 2, 'C': 4}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...