拉起来" dict"嵌套JSON的值为一级

时间:2018-01-20 00:55:01

标签: python list dictionary chef

我正在考虑将一些Chef run_lists转换为标签,并希望自动化该过程。

到目前为止,我所做的是创建一个运行的变量:

# write to file instead of directly to variable for archival purposes
os.system("knife search '*:*' -a expanded_run_list -F json > /tmp/hostname_runlist.json")
data = json.load(open('/tmp/hostname_runlist.json'))

从那里开始,我在dict中有一个dict,其列表值类似于:

{u'abc.com': {u'expanded_run_list': None}}
{u'foo.com': {u'expanded_run_list': u'base::default'}}
{u'123.com': {u'expanded_run_list': [u'utils::default', u'base::default']}}
...

我想通过删除' expanded_run_list'将其转换为更简单的字典。部分,因为此时不需要它,所以最后它看起来像这样:

abc.com:None
foo.com:'base::default'
123.com:['utils::default', 'base::default']

我希望将值保留为列表,或者将值保留为单个值,具体取决于返回的内容。当我发表声明'迭代,我可以从i.keys中提取主机名,但是需要从i.values中删除expanded_run_list键,以及适当地配对键值。

从那里开始,当运行os.system Chef命令来创建新标签时,我应该更容易遍历新字典。我用python编写了几年,所以有点生疏了。任何描述性的帮助将非常感激。

1 个答案:

答案 0 :(得分:1)

考虑到您将my_list = [ {u'abc.com': {u'expanded_run_list': None}}, {u'foo.com': {u'expanded_run_list': u'base::default'}}, {u'123.com': {u'expanded_run_list': [u'utils::default', u'base::default']}} ] 个对象列表作为:

[{k: v.get('expanded_run_list') for k, v in l.items()} for l in my_list]

然后,为了达到理想的效果,您可以将列表理解词典理解结合使用:

获取嵌套词典列表

[
     {u'abc.com': None}, 
     {u'foo.com': u'base::default'}, 
     {u'123.com': [u'utils::default', u'base::default']}
 ]

将返回所需格式的dict对象列表:

'expanded_run_list'

以上解决方案假设您只希望从每个嵌套字典中选取 key dict.get的值。如果它不存在,None将返回{k: v.get('expanded_run_list') for l in my_list for k, v in l.items()} ,它将在您生成的词典中设置为 value

用于提升嵌套字典以形成单字典

{
     'foo.com': 'base::default', 
     '123.com': ['utils::default', 'base::default'], 
     'abc.com': None
}

将返回:

script.css?v=1.0 // This is the URL for release 1.0