我正在考虑将一些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编写了几年,所以有点生疏了。任何描述性的帮助将非常感激。
答案 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