python 多层list 转dict问题

查看:116
本文介绍了python 多层list 转dict问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

我有一个list如下

list=[[['upstream', 'aa'], [['server', '172.16.1.6']]], [['upstream', 'bb'], [['server', '172.16.1.6:8080']]], [['server'], [['listen', '80'], ['server_name', 'aaa.test.com']]]]

类似上面的,可能还有更多层嵌套

请问这样的list,我怎么转换成dict

最好是类似

{'upstream:aa','server:172.16.1.6'}

这种

请注意,list里[]是分块的,这个分块对解析有意义,所以不能完全使用flatten()之类的压平。否则解析的时候就乱了。

目前 松林给出的代码,运算出来的答案是我想要的,不过实际上我的列表嵌套层数还更多一些。

不知道怎么解决。。

============================

更新问题

首先感谢各位的答案

其次,楼下第一的答案
如果这个list里有key是一样的,但是value可能有两个以上,比如

[[['location', '/']
.........
[['location', '~', '.*\.(ico|gif|jpg|jpeg|png|bmp|swf)$']]]]

在一个大的[]里,出现两次location,并且第二次的location有2个以上的value

[['location', '/']被后面的覆盖,而后面的因为有2个value,导致不满足key, value = lst if len(lst)==2 else (lst[0], ''),于是匹配不到[['location', '/']

解决方案

寫了一個,只有測你給的範例,你看看是不是你想要的那樣吧:

lst=[
        [
            ['upstream', 'aa'], 
            [
                ['server', '172.16.1.6']
            ]
        ],
        [
            ['upstream', 'bb'],
            [
                ['server', '172.16.1.6:8080']
            ]
        ],
        [
            ['server'], 
            [
                ['listen', '80'],
                ['server_name', 'aaa.test.com']
            ]
        ]
    ]

def turn2dic(lst):
    dic = {}
    if all([not isinstance(item, list) for item in lst]):
        key, value = lst if len(lst)==2 else (lst[0], '')
        dic[key] = value
    else:
        for item in lst:
            subdic = turn2dic(item)
            dic.update(subdic)
    return dic

results = []

for item in lst:
    results.append(turn2dic(item))

print results

这篇关于python 多层list 转dict问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆