我有一个相当大的JSON输出,我想重新分类。
我有一系列的循环来做我想做的事。
我在想,是否有更有效的方法来做我正在做的事?
我要做的是..。
抓住json水珠
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)发布于 2017-05-25 12:47:56
当您只需要一个数据时,您会对数据进行两次传递。
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 (当缺省值是一个更复杂的对象,而不是CPython为其保留空闲对象池的空列表或字典)时,它比setdefault更可取,因为在需要缺少键的值时调用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)https://stackoverflow.com/questions/44180820
复制相似问题