Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python3高效动态字典分组_Python_Json_Python 3.x_Dictionary - Fatal编程技术网

Python3高效动态字典分组

Python3高效动态字典分组,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'],

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