Вы можете перебирать список и рекурсивно преобразовывать элемент списка в кортеж, если элемент является экземпляром списка:
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, '-')))