TalismanChet
@TalismanChet
Лицо зла

Как разложить вложенные массивы в одномерный?

Допустим у меня есть массив ['lloc', [['.', 'orgstart']]], и мне нужно рекурсивно разложить его в одномерное состояние, например: ['lloc', '.', 'orgstart'], также желательно сделать чистку точек: ['lloc', 'orgstart'], но это уже не обязательно.
  • Вопрос задан
  • 207 просмотров
Решения вопроса 2
@denislysenko
data engineer
my_list = ['lloc', [['.', 'orgstart']]]


def my_function(array):
  res = ''
  for i in array:
    if type(i) != list and i != '.':
      res += i + ' '
    elif type(i) == list and i != '.':
      res += my_function(i)
  
  return res

result = my_function(my_list).split(' ')[:-1]
print(result) # -> ['lloc', 'orgstart']
Ответ написан
TalismanChet
@TalismanChet Автор вопроса
Лицо зла
Я сам решил задачу. В случае неверной структуры массива, возбуждается RuntimeError. Эта будет чуть оптимизированнее чем у denislysenko.
def flatten(array: list):
    def popen(arr: list | tuple):
        if not arr or not arr[0]:
            return arr
        while type(arr[0]) in (tuple, list):
            arr = arr[0]
            pass
        return arr
    if len(array) in (0, 1):
        return popen(array)
    if type(array[0]) == str:
        if type(array[1]) == list:
            return [array[0], *flatten(array[1:])]
            pass
        return array
    raise RuntimeError
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
from collections import abc

def flatten(iterable):
    for item in iterable:
        if isinstance(item, (str, bytes)):
            yield item
        elif isinstance(item, abc.Sequence):
            yield from flatten(item)
        else:
            yield item


data = ['lloc', [['.', 'orgstart']]]

flat_data = list(flatten(data))
clear_data = list(i for i in flatten(data) if i != '.')
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы