【问题标题】:Python Split Dict[String, List[String]] to List[Dict[String, String]] and keep every keys [duplicate]Python将Dict [String,List [String]]拆分为List [Dict [String,String]]并保留每个键[重复]
【发布时间】:2019-08-08 23:13:12
【问题描述】:

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

我需要转换字典:

{'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)

我可以有两个以上的钥匙,但我事先不知道它们的名字。

我正在寻找一种更优雅的方法来解决这个问题。

【问题讨论】:

    标签: python dictionary split


    【解决方案1】:

    根据我兄弟的回答,您可以通过这种方式获得通用解决方案:

    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()]
    • 实际上,它并没有完成这项工作,因为:使用这个字典:d = {'id': ['001', '002', '003'], 'tag1': ['val1']} 你的函数返回:[[{'id': '001'}, {'tag1': 'val1'}], [{'id': '002'}, {'tag1': 'val1'}], [{'id': '003'}, {'tag1': 'val1'}]] 这不是我需要的结果。
    • @ThomasJalabert 我已经更新了代码,以便它产生正确的输出。
    【解决方案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']) ]
    

    【讨论】:

    • 谢谢,但这仅适用于 2 个已知密钥,我没有此信息。我会相应地更新我的问题
    猜你喜欢
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多