如果我的嵌套對象是字典,它會更簡單,但這些是字典列表。 實施例:將嵌套對象的列表非規範化/拼合成點分隔的鍵值對
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 *深度)
隨着我當前的代碼:
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}
]
我能夠扁平化的對象(雖然不準確的),但我不能夠在每一個嵌套的對象來創建新的對象。 由於我的應用程序部署在應用程序引擎上,因此無法使用熊貓庫。
我發現一個複雜的對象('dict')總是封裝在列表中。如果在輸入時會發生什麼情況,例如'「d」:{「da」:4,「db」:6}'?那可能嗎? – CristiFati
不,嵌套對象將始終是列表中的對象。值始終是對象列表或字符串/數字。 – sheenu85
另一個問題:如果例如輸入中的第一個對象會有更多的那個列表字段呢?例如''d「:[{」da「:1,」db「:2},{」da「:3,」db「:4}]',那會在輸出中產生4個條目呢? – CristiFati