我有一个相当大的JSON输出,我想重新分类。
我有一系列循环来做我想要的。
我想知道,如果有更有效的方法来做我正在做的事情?
这就是我正在做的......
抓住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()
循环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()
Loop3:将节点名称填充到正确的组词典中......
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 blob ...
return json.dumps(group_dict,indent=1)
答案 0 :(得分: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)