recherche

Maison  >  Questions et réponses  >  le corps du texte

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', '/']

大家讲道理大家讲道理2893 Il y a quelques jours457

répondre à tous(4)je répondrai

  • PHP中文网

    PHP中文网2017-04-17 17:56:24

    J'en ai écrit un, juste pour tester l'exemple que vous m'avez donné, voir si c'est ce que vous voulez :

    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

    répondre
    0
  • 阿神

    阿神2017-04-17 17:56:24

    Vous pouvez faire ça

    ret = []
    for i in lst:
        d = {}
        d[i[0][0]] = i[0][1] if len(i[0])>1 else ''
        d.update({k:v for k, v in i[1]})
        ret.append(d)
    print ret
    

    Résultats

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

    répondre
    0
  • 高洛峰

    高洛峰2017-04-17 17:56:24

    Dans quelles circonstances une liste aussi inhumaine serait-elle conçue ?

    répondre
    0
  • ringa_lee

    ringa_lee2017-04-17 17:56:24

    Y a-t-il une idée ?
    Convertissez d'abord la liste en chaîne
    Ensuite, exécutez une boucle while et utilisez la fonction de remplacement pour remplacer les crochets
    Par exemple, '[[ ['Remplacez par '3', ']]' par '-2'
    Puis additionnez le numéro remplacé
    Une fois que vous obtenez 1, coupez-le et vous obtiendrez le résultat
    Essayez-le, si ce n'est pas le cas ça ne marche pas, réessayez Code

    répondre
    0
  • Annulerrépondre