Python 3高效动态字典分组

时间:2017-05-25 12:39:00

标签: python json python-3.x dictionary

我有一个相当大的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)

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)