Удалить ненужные слои из многомерного списка python - PullRequest
1 голос
/ 30 января 2020

Мой план состоит в том, чтобы превратить ввод многомерного списка с неизвестным количеством слоев, т.е. [["a"], [["b"], ["c"]]] в ["a", ["b", "c"]], но в настоящее время мой вывод такой же, как и у оригинала с приведенной ниже функцией:

def extract(tree):
    for x in range(len(tree)):
        if type(tree[x]) == list:
            extract(tree[x])
        else:
            tree = tree[x]

В принципе, я хочу удалить все ненужные слои в массиве, которые имеют только один элемент,

Есть идеи, что я делаю неправильно?

Спасибо за любую помощь

Ответы [ 3 ]

1 голос
/ 30 января 2020

Просто добавьте несколько возвратов, и ваш код работает отлично.

def extract(tree):
    for x in range(len(tree)):
        if type(tree[x]) == list:
            tree[x] = extract(tree[x])
        else:
            return tree[x]

    return tree

# test cases
test = [["a"], [["b"], ["c"]]]
print(extract(test))

test = [["a"], [["b"], ["c"], [["b"], ["c"]]]]
print(extract(test))
1 голос
/ 30 января 2020

Может быть что-то вроде:

def tree(element):
  if isinstance(element, str):
    return element
  elif len(element) == 1:
    return element[0]

  unfolded = []
  for each in element:
    unfolded.append(tree(each))
  return unfolded

a = [["a"], [["b"], ["c"]]]
print(tree(a)) # => ['a', ['b', 'c']]

0 голосов
/ 30 января 2020
  1. Обычно хорошо использовать isinstance () вместо type () для проверки типа в коде.

Не совсем уверен, что вы пытаетесь выполнить с помощью этого кода sh. Ответ Axe319 удалит все внутренние массивы / списки и вернет оба значения [["a"], [["b"], ["c"]]] и ["a", ["b", "c"]] как ['a','b','c']. Если вы sh составите список из одного, то двух, то трех и т. Д. c. (ie. [['a'], ['b', 'c'], ['d', 'e', 'f']...), вам придется изменить код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...