python - 遍历list,转换成dict
PHP中文网
PHP中文网 2017-04-17 17:54:02
0
4
435

我有一个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中文网

认证高级PHP讲师

membalas semua(4)
巴扎黑
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)

Idea umum ialah [['server', ''], ['port', '8800'], ['location', '/'], ['location', '/aa'], ['location', 'bb']] ini dianggap sebagai satu unit (fungsi diubah suai daripada kod yang anda berikan), secara rekursif sehingga tahap ia boleh diproses (kerana bilangan lapisan mungkin bukan 2)

Ty80

Kod:

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

Keputusan:

[{'location': ['/', '/aa', 'bb'], 'port': ['8800'], 'server': ['']}, {'location': ['/', '/aa', 'bb'], 'port': ['80'], 'server': ['']}]
  1. Saya rasa kod yang tidak perlu boleh dialih keluar Memandangkan masalah kali ini agak mudah (memandangkan lapisan bawah adalah senarai dua elemen kali ini), tidak perlu melakukan terlalu banyak pertimbangan. dan pemprosesan (malah rekursif ini Penyelesaian juga boleh ditukar kepada kaedah yang mudah).

  2. Saya tidak pasti sama ada terdapat perkara berulang lain dalam maklumat anda selain location saya rasa lebih baik memprosesnya secara seragam, jadi nilai dalam kamus saya berbeza daripada contoh yang anda berikan . , gunakan senarai dan bukannya rentetan.

伊谢尔伦

Pisahkan untuk kelihatan lebih baik

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))
左手右手慢动作

Orang lain telah mengajar anda cara memancing, jadi tahap anda tidak akan meningkat jika anda hanya meminta ikan

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan