кортеж вложенного списка - PullRequest
0 голосов
/ 18 января 2019

подумайте о наличии вложенного списка, который содержит вложенные списки, например:

list = [[], 3, [[2], [4], [5], [[],[3,[5,8]]]]]

как я могу получить кортеж из этого списка, который содержит только кортежи? !!! причина этого вопроса в том, что я хочу использовать его для представления бинарного дерева, которое я строю с некоторыми значениями (несбалансированными), и результат должен быть в кортеже. дерево строится поэтапно, и поскольку кортеж неизменен, я не могу использовать его с самого начала. В конце концов выход должен иметь такую ​​форму:

со значениями: 3 5 4 2 8 (начиная с 3 как root):

((-,2,-),3,((-,4,-),5,(-,8,-)))

1 Ответ

0 голосов
/ 18 января 2019

Вы можете перебирать список и рекурсивно преобразовывать элемент списка в кортеж, если элемент является экземпляром списка:

def to_tuple(lst):
    return tuple(to_tuple(item) if isinstance(item, list) else item for item in lst)

так что данный список преобразован в двоичное дерево в формате, предложенном вашим вопросом:

def btree(lst):
    tree = []
    for item in lst:
        node = tree
        while node:
            left, value, right = node
            node = right if value < item else left
        node[:] = [], item, []
    return tree

lst = [3, 5, 4, 2, 8]

, где btree(lst) возвращает:

[[[], 2, []], 3, [[[], 4, []], 5, [[], 8, []]]]

to_tuple(btree(lst)) вернется:

(((), 2, ()), 3, (((), 4, ()), 5, ((), 8, ())))

Если вы предпочитаете иметь '-' вместо пустых кортежей, вы можете вместо to_tuple вернуть '-', когда сгенерированный кортеж пуст:

def to_tuple(lst):
    return tuple(to_tuple(item) if isinstance(item, list) else item for item in lst) or '-'

так что to_tuple(btree(lst)) возвращает:

(('-', 2, '-'), 3, (('-', 4, '-'), 5, ('-', 8, '-')))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...