簡體   English   中英

如何將嚴格排序的字符串列表轉換為dict?

[英]How to convert a strictly sorted list of strings into dict?

我有一個嚴格排序的字符串列表:

['a',
 'b',
 'b/c',
 'b/d',
 'e',
 'f',
 'f/g',
 'f/h',
 'f/h/i',
 'f/h/i/j']

此列表類似於樹表示。 所以,我需要將其轉換為dict:

{'a': {},
 'b': {'c': {},
       'd': {}},
 'e': {},
 'f': {'g': {},
       'h': {'i': {'j': {}}}}}

正如你所看到的,這個詞典中的鍵是父母,價值觀是孩子。

UPD:我同意空的dictNone更好

如果您不堅持將None作為葉值,則可以使用緊湊代碼

my_dict = lambda: defaultdict(my_dict)
d = my_dict()
for x in my_list:
    reduce(defaultdict.__getitem__, x.split("/"), d)

誠然,這不是明顯這個代碼做什么,但它的簡潔:)

di = {}
for a in arr:
    al = a.split("/")
    d = di
    for elem in al:
        if elem in d:
            d = d[elem]
        else:
            d[elem]={}

print di

請注意,元素不是按字母順序存儲在字典中的!

這是我對它的抨擊。 我顛倒了優化路徑,因為pop()比pop(0)快得多。

def add_branch(root, path):
    branch = path.pop()
    if path:
        if branch not in root or root[branch] is None:
            root[branch] = {}
        add_branch(root[branch], path)
    else:
        root[branch] = None

def totree(strings):
    root = {}
    for string in strings:
        path = string.split("/")
        path.reverse()
        add_branch(root, path)
    return root

使用這樣:

my_tree = totree(['a', 'b', 'b/c', 'b/d', 'e', 'f', 'f/g', 'f/h', 
    'f/h/i', 'f/h/i/j'])

希望它有所幫助,遞歸方法:)

import pprint

l = ['a',
'b',
'b/c',
'b/d',
'e',
'f',
'f/g',
'f/h',
'f/h/i',
'f/h/i/j']

def put(d, elems):
    f = elems[0]
    if len(elems)==1:
        d[f]=None
    else:
        if f not in d or d[f]==None:
            d[f] = {}
        put(d[f], elems[1:])

d = {}
for x in l:
    put(d, x.split('/'))

pprint.pprint(d)

這是我的決議:

from collections import defaultdict
from pprint import pprint

input = ['a', 'b', 'b/c', 'b/d', 'e', 'f', 'f/g', 'f/h', 'f/h/i', 'f/h/i/j']
result = defaultdict(dict)
for i in input:
    path = i.split('/')
    key = path[0]
    value = {}
    buffer = {key:value}
    for folder in path[1:]:
        value[folder] = {}
        value = value[folder]
    result[key].update(buffer[key])
pprint(dict(result))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM