2017-05-25 47 views
0

我有一個相當大的JSON輸出,我想重新分類。Python 3高效的動態字典分組

我有一系列的循環來做我想做的事。

我想知道,如果有更有效的方法來做我在做什麼?

下面是我在做什麼...

抓住JSON BLOB創建組

nodes = self.getNodes() 
data = json.loads(nodes) 

臨時列表...

group_list = list() 

構建字典...

# I avoid the shorthand form for legibility 
group_dict = dict() 
group_dict['all'] = dict() 
group_dict['all']['hosts'] = list() 
group_dict['all']['vars'] = list() 

Lo OP 1:追加組的列表...

for l in data: 
    if '-' not in l['hostname']: 
    g = re.split('[0-9]+',l['hostname'],flags=re.IGNORECASE)[0] 
    group_list.append(g) 

獲取獨特的價值觀......

group_list = sorted(set(group_list)) 

迴路2:填充group_dict與團體字典...

for group in group_list: 
    group_dict[group] = dict() 
    group_dict[group]['hosts'] = list() 
    group_dict[group]['vars'] = list() 

循環3 :將節點名稱填充到正確的組字典中...

for n in data: 
    if '-' not in n['hostname']: 
    grp = re.split('[0-9]+',n['hostname'],flags=re.IGNORECASE)[0] 
    group_dict[grp]['hosts'].append(n['hostname']) 

返回縮進JSON一滴......

return json.dumps(group_dict,indent=1) 

回答

1

你讓過來的數據兩遍時,你只需要一個。

nodes = self.getNodes() 
data = json.loads(nodes) 

group_dict = {} 

for n in data: 
    if '-' not in n['hostname']: 
    grp = re.split('[0-9]+',n['hostname'],flags=re.IGNORECASE)[0] 
    group_dict.setdefault(grp, {'hosts':[], 'vars':[]}) 
    group_dict[grp]['hosts'].append(n['hostname']) 

return json.dumps(group_dict,indent=1) 

或者用defaultdict這是優選的,以setdefault時默認爲一個更復雜的對象,而不是一個空列表或字典其中CPython的保持空閒對象池作爲參數defaultdict缺少的值時被調用鍵是需要的:

from collections import defaultdict 

nodes = self.getNodes() 
data = json.loads(nodes) 

group_dict = defaultdict(lambda: {'hosts':[], 'vars':[]}) 

for n in data: 
    if '-' not in n['hostname']: 
    grp = re.split('[0-9]+',n['hostname'],flags=re.IGNORECASE)[0] 
    group_dict[grp]['hosts'].append(n['hostname']) 

return json.dumps(group_dict,indent=1) 
+0

閱讀'setdefault' ...很不錯 –