Python将Dict [String,List [String]]拆分为List [Dict [String,String]]并保留每个键

时间:2019-03-18 14:36:23

标签: python dictionary split

很抱歉,如果它与另一个问题重复。我一直在寻找它,但找不到与此相近的任何东西。

我需要转换字典:

{'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 个答案:

答案 0 :(得分:2)

编辑:这仅回答OP的原始措辞。

产品是您的朋友:

from itertools import product

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

答案 1 :(得分: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()) ]