Python3高效动态字典分组
我有一个相当大的JSON输出,我想重新分类 我有一系列循环来做我想做的事情 我在想,是否有更有效的方法来做我正在做的事情 这是我正在做的 抓取json blobPython3高效动态字典分组,python,json,python-3.x,dictionary,Python,Json,Python 3.x,Dictionary,我有一个相当大的JSON输出,我想重新分类 我有一系列循环来做我想做的事情 我在想,是否有更有效的方法来做我正在做的事情 这是我正在做的 抓取json blob nodes = self.getNodes() data = json.loads(nodes) 用于创建组的临时列表 group_list = list() for l in data: if '-' not in l['hostname']: g = re.split('[0-9]+',l['hostname'],
nodes = self.getNodes()
data = json.loads(nodes)
用于创建组的临时列表
group_list = list()
for l in data:
if '-' not in l['hostname']:
g = re.split('[0-9]+',l['hostname'],flags=re.IGNORECASE)[0]
group_list.append(g)
构造字典
# I avoid the shorthand form for legibility
group_dict = dict()
group_dict['all'] = dict()
group_dict['all']['hosts'] = list()
group_dict['all']['vars'] = list()
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'])
循环1:追加组列表
group_list = list()
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\u dict
for group in group_list:
group_dict[group] = dict()
group_dict[group]['hosts'] = list()
group_dict[group]['vars'] = list()
Loop3:将节点名称填充到正确的组字典中
# I avoid the shorthand form for legibility
group_dict = dict()
group_dict['all'] = dict()
group_dict['all']['hosts'] = list()
group_dict['all']['vars'] = list()
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)
在只需要一次的情况下,对数据进行两次传递
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)
在只需要一次的情况下,对数据进行两次传递
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)