如何在Python中从字符串列表创建目录树?

2024-10-16 20:42:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我想写一个函数,模仿Python中的文件夹结构。给定一个字符串列表,我想创建一个文件夹树&;子文件夹。例如:

['beers'、'wines'、'beers/ipa/stone'、'wines/red/cabernet']

将输出具有以下内容的词典:

    { 
        'beers': {
            'ipa': {
                'stone': {}
            } 
        },

        'wines': {
            'red': {
                'cabernet': {}
            }
        }
    }

Tags: 函数字符串文件夹列表red结构词典amp
2条回答

只需浏览列表并添加在斜杠字符上拆分的每个字符串的名称。您可以使用setdefault()确保下一级字典存在(即,在运行时自动创建条目)

strings = ['beers', 'wines', 'beers/ipa/stone', 'wines/red/cabernet']
directory = dict()
for path in strings:
    d = directory
    for name in path.split("/"):
        d = d.setdefault(name,dict())
print(directory)

{'beers':
    { 'ipa': {'stone': {}} },
 'wines': 
    {'red':  {'cabernet': {}} }
}

使用Python3,每个dict中的项目顺序将与字符串列表中的原始相对顺序相对应

如果希望每个字典中的项目以字母数字顺序显示,可以如下更改循环:

directory = dict()
for path in sorted(s.split("/") for s in strings):
    d = directory
    for name in path:
        d = d.setdefault(name,dict())

如果您喜欢递归函数,这里有一个简单的函数可以做同样的事情(但效率较低):

def makeTree(strings, separator="/", tree=None):
    tree = tree or dict()
    for name,*subs in (s.split(separator,1) for s in strings):
        tree[name] = makeTree(subs, separator, tree.get(name))
    return tree

d = makeTree(strings)
print(d)

{'beers':
    { 'ipa': {'stone': {}} },
 'wines': 
    {'red':  {'cabernet': {}} }
}
x = ['beers', 'wines', 'beers/ipa/stone', 'wines/red/cabernet']

def add_items(d, items):
    if len(items) == 1:
        if items[0] in d:
            return
        else:
            d[items[0]] = dict()
    else:
        if items[0] not in d:
            d[items[0]] = dict()
        add_items(d[items[0]], items[1:])

out = dict()
for item in x:
    items = item.split("/")
    add_items(out, items)
print(out)

{'wines': {'red': {'cabernet': {}}}, 'beers': {'ipa': {'stone': {}}}}

相关问题 更多 >