recherche

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

python - 遍历list,转换成dict

我有一个list如下

[[['server', ''],['port','8800'],['location','/'],['location','/aa'],['location','bb']],[['server', ''],['port','80'],['location','/'],['location','/aa'],['location','bb']]]

想要得到如下的dict


[{'server': '','port': '8800','location': '/,/aa,/bb'},{'server': '','port': '80','location': '/,/aa,/bb'}]

或者

[{'server': '','port': '8800','location': '/'},{'server': '','port': '8800','location': '/aa'},{'server': '','port': '8800','location': '/bb'},{'server': '','port': '80','location': '/'},{'server': '','port': '80','location': '/aa'},{'server': '','port': '80','location': '/bb'}]

求解

之前有sf上的同学给出了一个例子

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

但是这个上面代码里,location是覆盖的,因为dic.update(subdic),有什么办法是append的?

PHP中文网PHP中文网2814 Il y a quelques jours442

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

  • 巴扎黑

    巴扎黑2017-04-17 17:56:02

    def single_turn2dic(lst):
        global key, value
        dic = {}
        if all([not isinstance(item, list) for item in lst]):
            if len(lst) == 2:
                key, value = lst
            elif len(lst) == 1:
                key = lst[0]
                value = ''
            elif len(lst) == 3:
                key = lst[0]
                value = lst[1]
                # dic[key] = value
            if value and dic.get(key, ''):
                dic[key] += ',' + value
            else:
                dic[key] = value
    
        else:
            for item in lst:
                subdic = single_turn2dic(item)
                # print subdic
                # dic.update(subdic)
                for name, name_value in subdic.iteritems():
                    if name_value and dic.get(name, ''):
                        dic[name] += ',' + name_value
                    else:
                        dic[name] = name_value
                        # print dic
        return dic
    
    
    servers = [[['server', ''], ['port', '8800'], ['location', '/'], ['location', '/aa'], ['location', 'bb']],
               [['server', ''], ['port', '80'], ['location', '/'], ['location', '/aa'], ['location', 'bb']]]
    
    
    def beautify(servers):
        # lst = []
        if not isinstance(servers[0][0], list):
    
            return single_turn2dic(servers)
        else:
            return [beautify(server) for server in servers]
            
    
    
    
    print beautify(servers)
    

    L'idée générale est que [['server', ''], ['port', '8800'], ['location', '/'], ['location', '/aa'], ['location', 'bb']] ceci est traité comme une unité (la fonction est modifiée à partir du code que vous avez donné), de manière récursive dans la mesure où elle peut être traitée (car le nombre de couches ne peut pas être de 2)

    répondre
    0
  • PHP中文网

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

    Code :

    def turn2dic(lst):
        dic = {}
        if all([not isinstance(item, list) for item in lst]):
            key, value = lst
            dic[key] = value
        else:
            for item in lst:
                subdic = turn2dic(item)
                for key, value in subdic.items():
                    dic.setdefault(key, []).append(value)
        return dic
    
    results = [turn2dic(item) for item in lst]
    
    print results

    Résultat :

    [{'location': ['/', '/aa', 'bb'], 'port': ['8800'], 'server': ['']}, {'location': ['/', '/aa', 'bb'], 'port': ['80'], 'server': ['']}]
    1. Je pense que le code inutile peut être supprimé. Puisque le problème cette fois est relativement simple (puisqu'il est déterminé que la couche inférieure est cette fois une liste de deux éléments), il n'est pas nécessaire de faire trop de jugement. et le traitement (même cette solution récursive peut également être modifiée en une méthode simple).

    2. Je ne sais pas s'il y a d'autres éléments répétitifs dans vos informations en dehors de location. Je pense qu'il est préférable de les traiter uniformément, donc les valeurs de mon dictionnaire sont différentes des exemples que vous avez donnés. , utilisez la liste au lieu de la chaîne.

    répondre
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 17:56:02

    Démontez-le pour avoir une meilleure apparence

    from collections import defaultdict
    
    def testtype(t):
        return lambda x: isinstance(x, t)
    
    def test(t, lst):
        return all(map(t if callable(t) else testtype(t), lst))
    
    def parse_dict(lst):
        dct = defaultdict(lambda: [])
        for k, v in lst:
            dct[k].append(parse(v))
        ret = {}
        for k, v in dct.items():
            if test(str, v):
                v = ','.join(v)
            elif len(v) == 1:
                v = v[0]
            ret[k] = v
            
        return ret
    
    def parse(obj):
        if not isinstance(obj, list):
            return obj
        if test(lambda x: len(x) == 2, obj):
            return parse_dict(obj)
        return list(map(parse, obj))
    
    src= [[['server', ''],['port','8800'],['location','/'],['location','/aa'],['location','bb']],[['server', ''],['port','80'],['location','/'],['location','/aa'],['location','bb']]]
    print(parse(src))

    répondre
    0
  • ringa_lee

    ringa_lee2017-04-17 17:56:02

    D'autres vous ont déjà appris à pêcher, donc votre niveau ne s'améliorera pas si vous demandez simplement du poisson

    répondre
    0
  • Annulerrépondre