Python - Flatten the list of dictionaries

后端 未结 4 1342
情话喂你
情话喂你 2021-01-01 09:54

List of dictionaries:

data = [{
         \'a\':{\'l\':\'Apple\',
                \'b\':\'Milk\',
                \'d\':\'Meatball\'},
         \'b\':{\'favou         


        
4条回答
  •  余生分开走
    2021-01-01 10:31

    You can use functools.reduce along with a simple list comprehension to flatten out the list the of dicts

    >>> from functools import reduce 
    
    >>> data = [{'b': {'dislike': 'juice', 'favourite': 'coke'}, 'a': {'l': 'Apple', 'b': 'Milk', 'd': 'Meatball'}}, {'b': {'dislike': 'juice3', 'favourite': 'coke2'}, 'a': {'l': 'Apple1', 'b': 'Milk1', 'd': 'Meatball2'}}]
    >>> [reduce(lambda x,y: {**x,**y},d.values()) for d in data]
    >>> [{'dislike': 'juice', 'l': 'Apple', 'd': 'Meatball', 'b': 'Milk', 'favourite': 'coke'}, {'dislike': 'juice3', 'l': 'Apple1', 'd': 'Meatball2', 'b': 'Milk1', 'favourite': 'coke2'}]
    

    Time benchmark is as follows:

    >>> import timeit
    >>> setup = """
          from functools import reduce
          data = [{'b': {'dislike': 'juice', 'favourite': 'coke'}, 'a': {'l': 'Apple', 'b': 'Milk', 'd': 'Meatball'}}, {'b': {'dislike': 'juice3', 'favourite': 'coke2'}, 'a': {'l': 'Apple1', 'b': 'Milk1', 'd': 'Meatball2'}}]
      """
    >>> min(timeit.Timer("[reduce(lambda x,y: {**x,**y},d.values()) for d in data]",setup=setup).repeat(3,1000000))
    >>> 1.525032774952706
    

    Time benchmark of other answers on my machine

    >>> setup = """
            data = [{'b': {'dislike': 'juice', 'favourite': 'coke'}, 'a': {'l': 'Apple', 'b': 'Milk', 'd': 'Meatball'}}, {'b': {'dislike': 'juice3', 'favourite': 'coke2'}, 'a': {'l': 'Apple1', 'b': 'Milk1', 'd': 'Meatball2'}}]
        """
    >>> min(timeit.Timer("[{k: v for x in d.values() for k, v in x.items()} for d in data]",setup=setup).repeat(3,1000000))
    >>> 2.2488374650129117
    
    >>> min(timeit.Timer("[{k: x[k] for x in d.values() for k in x} for d in data]",setup=setup).repeat(3,1000000))
    >>> 1.8990078769857064
    
    >>> code = """
          L = []
          for d in data:
              temp = {}
              for key in d:
                  temp.update(d[key])
    
              L.append(temp)
        """
    
    >>> min(timeit.Timer(code,setup=setup).repeat(3,1000000))
    >>> 1.4258553800173104
    
    >>> setup = """
          from itertools import chain
          data = [{'b': {'dislike': 'juice', 'favourite': 'coke'}, 'a': {'l': 'Apple', 'b': 'Milk', 'd': 'Meatball'}}, {'b': {'dislike': 'juice3', 'favourite': 'coke2'}, 'a': {'l': 'Apple1', 'b': 'Milk1', 'd': 'Meatball2'}}]
        """
    >>> min(timeit.Timer("[dict(chain(*map(dict.items, d.values()))) for d in data]",setup=setup).repeat(3,1000000))
    >>> 3.774383604992181
    

提交回复
热议问题