Flatten nested dictionaries, compressing keys

前端 未结 28 2688
遇见更好的自我
遇见更好的自我 2020-11-22 01:16

Suppose you have a dictionary like:

{\'a\': 1,
 \'c\': {\'a\': 2,
       \'b\': {\'x\': 5,
             \'y\' : 10}},
 \'d\': [1, 2, 3]}

Ho

28条回答
  •  萌比男神i
    2020-11-22 01:47

    Variation of this Flatten nested dictionaries, compressing keys with max_level and custom reducer.

      def flatten(d, max_level=None, reducer='tuple'):
          if reducer == 'tuple':
              reducer_seed = tuple()
              reducer_func = lambda x, y: (*x, y)
          else:
              raise ValueError(f'Unknown reducer: {reducer}')
    
          def impl(d, pref, level):
            return reduce(
                lambda new_d, kv:
                    (max_level is None or level < max_level)
                    and isinstance(kv[1], dict)
                    and {**new_d, **impl(kv[1], reducer_func(pref, kv[0]), level + 1)}
                    or {**new_d, reducer_func(pref, kv[0]): kv[1]},
                    d.items(),
                {}
            )
    
          return impl(d, reducer_seed, 0)
    

提交回复
热议问题