【问题标题】:Create one dictionary for each combination of list-values in a dictionary为字典中的每个列表值组合创建一个字典
【发布时间】:2019-05-04 04:34:41
【问题描述】:

我有以下字典:

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' 并仅根据最后一个值创建一个字典。

【问题讨论】:

  • 你需要创建一个defaultdict(list)

标签: python list dictionary


【解决方案1】:

如果你的 dict 只能有一个列表,那就很容易了。

>>> 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}]

如果你的 dict 可以有多个列表,那就有点棘手了。

>>> 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}]

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2022-10-05
  • 2016-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-17
  • 2018-09-18
  • 1970-01-01
相关资源
最近更新 更多