首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python 3高效动态字典分组

Python 3高效动态字典分组
EN

Stack Overflow用户
提问于 2017-05-25 12:39:00
回答 1查看 34关注 0票数 0

我有一个相当大的JSON输出,我想重新分类。

我有一系列的循环来做我想做的事。

我在想,是否有更有效的方法来做我正在做的事?

我要做的是..。

抓住json水珠

代码语言:javascript
复制
nodes = self.getNodes()
data =  json.loads(nodes)

创建组的临时列表..。

代码语言:javascript
复制
group_list = list()

编字典..。

代码语言:javascript
复制
# 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:附加一个组列表..。

代码语言:javascript
复制
for l in data:
  if '-' not in l['hostname']:
    g = re.split('[0-9]+',l['hostname'],flags=re.IGNORECASE)[0]
    group_list.append(g)

得到独特的价值..。

代码语言:javascript
复制
group_list = sorted(set(group_list))

循环2:用组字典填充group_dict ..。

代码语言:javascript
复制
for group in group_list:
  group_dict[group] = dict()
  group_dict[group]['hosts'] = list()
  group_dict[group]['vars'] = list()

Loop3:将节点名填充到正确的组字典中。

代码语言:javascript
复制
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 ..。

代码语言:javascript
复制
return json.dumps(group_dict,indent=1)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-25 12:47:56

当您只需要一个数据时,您会对数据进行两次传递。

代码语言:javascript
复制
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的参数:

代码语言:javascript
复制
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)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44180820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档