python - 为字典中的每个列表值组合创建一个字典
问题描述
我有以下字典:
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'
并仅基于最后一个值创建一个字典。
解决方案
如果您的 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}]
推荐阅读
- reactjs - 如何将数据传递到一个页面中
在反应? - informatica-powercenter - 信息技术 | 具有更多目标的会话的性能影响
- html - type='file' 在 angularjs 中不起作用
- c - 如何使二维排列的参数在函数中使用
- sql-server - 如何在 SQL Server 中删除延期日期
- bash - 如何通过 grep 命令正确使用正则表达式组捕获?
- reference - 当旧的枚举被丢弃时,有没有办法从 &mut 枚举中提取值?
- netsuite - 休息项目组自定义价格
- constructor - 未设置可靠性值
- javascript - 修改用 jQuery 创建的数组