Рекурсивно сглаживайте вложенный список целых чисел с помощью указателей нижнего и верхнего уровня

#python #list #recursion

Вопрос:

Я видел несколько ответов, которые сглаживали вложенный список целых чисел (первый фрагмент кода) со списком в качестве единственного параметра: flatten(lst) . Мое задание состоит в том, чтобы сделать то же самое, но с двумя индексами (низкий lt;= высокий), которые указывают диапазон рассматриваемых индексов: flatten(lst, low, high) .

Рабочий код с одним параметром

 def flatten(lst):  if not lst:  return lst  if isinstance(lst[0], list):  return flatten(lst[0])   flatten(lst[1:])  return lst[:1]   flatten(lst[1:])  

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

Мой код

 def flatten(lst, low, high):  if low gt; high:  return lst  elif isinstance(lst[low], list):  return flatten(lst[low], 0, len(lst[low]) - 1)   flatten(lst[low   1:], 0, len(lst[low   1:]) - 1)  else:  return lst[:low]   flatten(lst[low   1:], 0, len(lst[low   1:]) - 1)  

Это то, что я использую для тестирования своего кода.

 print(flatten([[1, 2], 3, [4, [5, 6, [7], 8]]], 0, 2))  

Ответ №1:

Вы могли бы использовать исходную функцию как есть с назначением индекса:

 def flatten(lst):  if not lst:  return lst  if isinstance(lst[0], list):  return flatten(lst[0])   flatten(lst[1:])  return lst[:1]   flatten(lst[1:])  L = [[1, 2], 3, [4, [5, 6, [7], 8]]]  L[0:2] = flatten(L[0:2]) print(L)  [1, 2, 3, [4, [5, 6, [7], 8]]]  

Или реализуйте новую функцию, которая использует первую:

 def flattenRange(L,low,high):  L = L.copy()  L[low:high] = flatten(L[low:high]) # use high 1 if it is inclusive  return L  

Или даже «ублюдок», … Я имею в виду «улучшить» оригинал:

 def flatten(lst,low=0,high=None):  if lowgt;0 or high is not None:  lst = lst.copy()  lst[low:high] = flatten(lst[low:high]) # use high 1 if it's inclusive  return lst  if not lst:  return lst  if isinstance(lst[0], list):  return flatten(lst[0])   flatten(lst[1:])  return lst[:1]   flatten(lst[1:])  

Комментарии:

1. Спасибо вам за ответ! К сожалению, это часть задания, в котором мне нужно реализовать функцию def flatten(lst, low, high) :/

2. Ален, еще раз спасибо, я настроил функцию «ублюдок», чтобы включить различные низкие значения, и она отлично работает.