【发布时间】:2018-03-02 16:24:33
【问题描述】:
如果我的嵌套对象是字典会更简单,但这些是字典列表。 示例:
all_objs1 = [{
'a': 1,
'b': [{'ba': 2, 'bb': 3}, {'ba': 21, 'bb': 31}],
'c': 4
}, {
'a': 11,
'b': [{'ba': 22, 'bb': 33, 'bc': [{'h': 1, 'e': 2}]}],
'c': 44
}]
我希望输出格式如下:
[
{'a': 1, 'b.ba': 2, 'b.bb': 3, 'c': 4},
{'a': 1, 'b.ba': 21, 'b.bb': 31, 'c': 4},
{'a': 11, 'b.ba': 22, 'b.bb': 33, 'bc.h': 1, 'bc.e': 2, 'c': 44},
]
基本上,生成的展平对象的数量将等于 (obj * depth)
使用我当前的代码:
def flatten(obj, flattened_obj, last_key=''):
for k,v in obj.iteritems():
if not isinstance(v, list):
flattened_obj.update({last_key+k : v})
else:
last_key += k + '.'
for nest_obj in v:
flatten(nest_obj, flattened_obj, last_key)
last_key = remove_last_key(last_key)
def remove_last_key(key_path):
second_dot = key_path[:-1].rfind('.')
if second_dot > 0:
return key_path[:second_dot+1]
return key_path
输出:
[
{'a': 1, 'b.bb': 31, 'c': 4, 'b.ba': 21},
{'a': 11, 'b.bc.e': 2, 'c': 44, 'b.bc.h': 1, 'b.bb': 33, 'b.ba': 22}
]
我能够展平对象(虽然不准确),但我无法在每个嵌套对象上创建一个新对象。 由于我的应用部署在应用引擎上,因此我无法使用 pandas 库。
【问题讨论】:
-
我看到一个复杂的对象(一个
dict)总是被封装在一个列表中。如果在输入中你会发生什么,例如"d" : {"da": 4, "db": 6}?这可能吗? -
不,嵌套对象将始终是列表中的对象。值始终是对象列表或字符串/数字。
-
另一个问题:例如,如果输入中的第一个对象会有多个列表字段怎么办?例如
"d": [{"da": 1, "db": 2},{"da": 3, "db": 4}],这会在输出中产生 4 个条目吗? -
@CristiFati,首先只能有一个包含更多字典列表的键。但是这些字典可以以同样的方式进一步嵌套。所以在第一个对象中,如果集合在“b”处,它不能有任何其他的集合键。
标签: python json recursion flatten denormalized