Split dictionary of lists into list of dictionaries

前端 未结 8 1849
时光取名叫无心
时光取名叫无心 2020-12-09 21:16

What i need to do is to convert something like this

{\'key1\': [1, 2, 3], \'key2\': [4, 5, 6]}

into

[{\'key1\': 1, \'key2\'         


        
8条回答
  •  一个人的身影
    2020-12-09 21:32

    Works for any number of keys

    >>> map(dict, zip(*[[(k, v) for v in value] for k, value in d.items()]))
    [{'key2': 4, 'key1': 1}, {'key2': 5, 'key1': 2}, {'key2': 6, 'key1': 3}]
    

    For example:

    d = {'key3': [7, 8, 9], 'key2': [4, 5, 6], 'key1': [1, 2, 3]}
    
    >>> map(dict, zip(*[[(k, v) for v in value] for k, value in d.items()]))
    [{'key3': 7, 'key2': 4, 'key1': 1}, {'key3': 8, 'key2': 5, 'key1': 2}, {'key3': 9, 'key2': 6, 'key1': 3}]
    

    A general solution that works on any number of values or keys: (python2.6)

    >>> from itertools import izip_longest
    >>> d = {'key2': [3, 4, 5, 6], 'key1': [1, 2]}
    >>> map(lambda a: dict(filter(None, a)), izip_longest(*[[(k, v) for v in value] for k, value in d.items()]))
    [{'key2': 3, 'key1': 1}, {'key2': 4, 'key1': 2}, {'key2': 5}, {'key2': 6}]
    

    And if you don't have python2.6:

    >>> d = {'key2': [3, 4, 5, 6], 'key1': [1, 2]}
    >>> map(lambda a: dict(filter(None, a)), map(None, *[[(k, v) for v in value] for k, value in d.items()]))
    [{'key2': 3, 'key1': 1}, {'key2': 4, 'key1': 2}, {'key2': 5}, {'key2': 6}]
    

提交回复
热议问题