[英]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:我同意空的dict比None更好
如果您不堅持將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.