Рекурсивно выровнять список, отслеживать глубину рекурсии - PullRequest
0 голосов
/ 22 октября 2018

У меня есть произвольный список списков, и моя цель состоит в том, чтобы сгладить этот список, а также получить возвращаемый уровень, с которого я извлек каждый элемент.Я должен сказать, что простые списки содержат кортежи примерно так:

[(13,1), [(12,2), (14,1)], [[(11,2), (5,7)], (8,2)]]

Что я уже сделал, это сгладил этот список с помощью этого рекурсивного метода:

def unpack(x):
    if x == []:
        return x
    if isinstance(x[0], list):
        return unpack(x[0]) + unpack(x[1:])
    return x[:1] + unpack(x[1:])

Это возвращаетследующее (что вполне нормально для меня):

[(13,1), (12,2), (14,1), (11,2), (5,7), (8,2)]

В итоге я хочу получить:

[{(13,1):1}, {(12,2):2}, {(14,1),2}, {(11,2):3}, {(5,7):3}, {(8,2):2}]

Пока я пробовал это:

def unpack(x,n=0):
    if x == []:
        return {x:n}
    if isinstance(x[0], list):
        return unpack(x[0],n+1) + unpack(x[1:],n+1)
    return x[:1] + unpack(x[1:],n+1)

Но я получаю сообщение об ошибке: «TypeError: unhashable type: 'list''

У вас есть идеи, как вернуть список словарей?

1 Ответ

0 голосов
/ 22 октября 2018

Вы неправильно изменяете исходную функцию.Вы должны преобразовать только неупакованный предмет в диктовку:

def unpack(x, n=1):
    if x == []:
        return x
    if isinstance(x[0], list):
        return unpack(x[0], n + 1) + unpack(x[1:], n)
    return [{x[0]: n}] + unpack(x[1:], n)

, чтобы:

unpack([(13,1), [(12,2), (14,1)], [[(11,2), (5,7)], (8,2)]])

вернул:

[{(13, 1): 1}, {(12, 2): 2}, {(14, 1): 2}, {(11, 2): 3}, {(5, 7): 3}, {(8, 2): 2}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...