Как создать дерево каталогов из списка строк в Python? - PullRequest
0 голосов
/ 04 мая 2020

Я хотел бы написать функцию, которая имитирует структуру папок в Python. Учитывая список строк, я хотел бы создать дерево папок и подпапок. Например:

['пиво', 'вино', 'пиво / ipa / stone', 'wines / red / cabe rnet']

Выводит словарь со следующим :

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

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

Ответы [ 2 ]

1 голос
/ 04 мая 2020
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': {}}}}
1 голос
/ 04 мая 2020

Просто go через список и добавление имен каждой строки, которую вы разбиваете на символ sla sh. Вы можете использовать setdefault (), чтобы гарантировать, что словарь следующего уровня существует (т.е. автоматически создавать записи, как вы go)

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': {}} }
}

С Python 3, порядок элементов в каждом dict будут соответствовать их исходному относительному порядку в списке строк

Если вы хотите, чтобы элементы в каждом словаре отображались в алфавитно-цифровом порядке, вы можете изменить l oop следующим образом:

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': {}} }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...