将Python中的Split Dict[String, List[String]]转换为List[Dict[String, String]]并保留所有键

3

如果这是重复的问题,我很抱歉。我已经寻找过了,但是没有找到任何与此类似的内容。

我需要转换一个字典:

{'id': ['001', '002', '003'], 'tag1': ['val1']}

转换为字典列表:
[{'id': '001', 'tag1': 'val1'}, {'id': '002', 'tag1': 'val1'}, {'id': '003', 'tag1': 'val1'}]

请注意,此字典为示例,我无法确定字典中键的数量或名称。
我已使用以下代码解决了我的问题:
pfilter = dict()
pfilter["id"] = ["001", "002", "003"]
pfilter["tag1"] = ["val1"]
print(pfilter)

all_values = list(itertools.product(*pfilter.values()))
all_keys = [pfilter.keys()]*len(all_values)
all_dict = [zip(keys, values) for keys, values in zip(all_keys, all_values)]
all_dict = [{k:v for k, v in item} for item in all_dict]
print(all_dict)

我可能有超过2个键,但事先不知道它们的名称。

我正在寻找一种更优雅的解决方法。

2个回答

2

编辑:这仅回答了原始问题的内容。

产品是你的朋友:

from itertools import product

d = {'id': ['001', '002', '003'], 'tag1': ['val1']}
[ {'id':id, 'tag1': tag1 } for id,tag1 in product(d['id'],d['tag1']) ]

感谢您,但这个工作仅适用于已知的两个密钥,而我没有这些信息。我会相应地更新我的问题。 - Thomas Jalabert

2
建立在我兄弟的回答上,你可以这样实现一个通用解决方案: "最初的回答"。
from itertools import product

d = {'id': ['001', '002', '003'], 'tag1': ['val1'], 'other_key': ['o1','o2']}
all_dict = [dict([(k,v) for k,v in zip(d.keys(), item)]) for item in product(*d.values()) ]


谢谢,它完成了工作!但我们可以用d.values()替换[d[key] for key in d.keys()] - Thomas Jalabert
实际上,它不能完成工作,因为: 使用这个字典: d = {'id': ['001', '002', '003'], 'tag1': ['val1']}你的函数返回: [[{'id': '001'}, {'tag1': 'val1'}], [{'id': '002'}, {'tag1': 'val1'}], [{'id': '003'}, {'tag1': 'val1'}]] 而这不是我需要的结果。 - Thomas Jalabert
@ThomasJalabert,我已经更新了代码,现在它可以产生正确的输出。 - John Sloper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接