У меня есть dictionary в этом формате destination location : list of supply locations -

dict_input = {'A':['B'], 'B':['C','Y'], 'C':['D'], 'Y':['Z']}

Для места назначения 'A' я хочу выяснить места конечных поставок в цепочке поставок (местоположения 'D' и 'Z' в данном случае)

Я написал такую функцию -

def get_source(node):
    source = []
    if node in dict_input:
        next_node = dict_input[node]
                 source = [get_source(i) for i in next_node]
        return list(source)
    else:
        return node

Когда я выполняю функцию - print("The source is", get_source('A')), я получаю The source is [[['D'], ['Z']]]. Это список в списке. Почему я получаю вывод таким образом? Как получить вывод как The source is ['D', 'Z']?

0
Karvy1 26 Сен 2018 в 10:01

2 ответа

Лучший ответ

Понимание списка возвращает список, а ваши хэш-записи являются списками, что объясняет вложенный результат:

>>> [ get_source(i) for i in dict_input['A'] ]
[[['D'], ['Z']]]

Вы можете использовать список для накопления результата и использовать понимание списка просто для посещения всех узлов:

def get_source(n, acc=[]):
    if n in dict_input:
        [ get_source(i, acc) for i in dict_input[n] ]
    else:
        acc.append(n)
    return acc

>>> get_source('A', [])
['D','Z']
0
chriopp 26 Сен 2018 в 08:03
dict_input = {'A':['B'], 'B':['C','Y'], 'C':['D'], 'Y':['Z']}

def get_source(node):
    source = []
    if node in dict_input:
        next_node = dict_input[node]
        for i in next_node:
            source += get_source(i) # source.extend(get_source(i))

        return source
    else:
        return [node,] # just return node if output of get_source('Z') should be just 'Z' 


print(get_source('A')) #['D', 'Z']
print(get_source('B')) #['D', 'Z']
print(get_source('Z')) #['Z']
1
Tanmay jain 26 Сен 2018 в 08:01