2017-05-25 3 views
0

Ich habe eine ziemlich große JSON-Ausgabe, die ich neu kategorisieren möchte.Python 3 effiziente dynamische Wörterbuch Gruppierung

Ich habe eine Reihe von Schleifen zu tun, was ich will.

Ich frage mich, ob es eine effizientere Möglichkeit gibt, das zu tun, was ich mache?

Hier ist, was ich tue ...

greifen die json blob

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

Temporäre Liste für die Gruppen ... und

group_list = list() 

das Wörterbuch Construct ...

# 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: eine Liste der Gruppen Anfügen ...

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

eindeutige Werte Get ...

group_list = sorted(set(group_list)) 

Loop 2: Bestücken group_dict mit Gruppen Wörterbücher ...

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

Loop3 : Tragen Sie die Knotennamen in das richtige Gruppenwörterbuch ein ...

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 gegliederten JSON blob ...

return json.dumps(group_dict,indent=1) 

Antwort

1

Sie machen zwei Durchgänge über die Daten, wenn Sie nur ein benötigen.

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) 

Oder defaultdict verwendet, die zu setdefault vorzuziehen ist, wenn der Standard ein komplexeres Objekt ist eher als eine leere Liste oder Wörterbuch für die CPython freie Objekte Pools als das Argument zu defaultdict hält aufgerufen wird, wenn der Wert von a fehlt Schlüssel wird benötigt:

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

lesen Sie auf 'setdefault' ... ziemlich nett –

Verwandte Themen