Как развернуть (выровнять) ненужный вложенный список без изменения его формы?(Python) - PullRequest
0 голосов
/ 15 февраля 2019

Это совсем не то, что я обнаружил во многих потоках - я не хочу сделать список плоским, но разложить уровни следующим образом:

[[[3, 3]]] должно быть [3, 3]

[[[3, 4], [3, 3]]] должно быть [[3, 4], [3, 3]], но не [3, 4], [3, 3] или [3, 4, 3, 3], потому что это полностью меняет структуру.

По сути, я хотел уменьшить уровни, чтобы получить одинаковые len(a_list) в первой и второй итерации перед разрывом цикла.Но моя идея несколько ошибочна:

Этот код работает для всего, кроме [[3], [4]].Не знаю, что не так сегодня, потому что это сработало вчера.Нужна помощь, чтобы исправить эту функцию.Теперь он возвращает [3], но должен быть неизменным.

# Unlevel list - reduce unnecessary nesting without changing nested lists structure
def unlevelList(l):
    if len(l) > 0 and isinstance(l, list):
        done = True
        while done == True:
            if isinstance(l[0], list):
                if len(l) == len(l[0]):
                    l = l[0]
                else:
                    l = l[0]
                    done = False
            else:
                done = False
        return l
    else:
        return l

Ответы [ 3 ]

0 голосов
/ 15 февраля 2019

Я бы также рекомендовал рекурсивное решение

def unnest(l):
    if isinstance(l, list) and len(l) == 1 and isinstance(l[0], list):
        return unnest(l[0])
    return l

В некоторых тестах

test_cases = [
    [[[3], [3, 3]]],
    [[[3, 3]]],
    [[[3, 4], [3, 3]]],
    [[3], [4]],
    [[[3]]]
]

for i in test_cases:
    print(unnest(i))

дает

[[3], [3, 3]]
[3, 3]
[[3, 4], [3, 3]]
[[3], [4]]
[3]
0 голосов
/ 15 февраля 2019

Этот код, кажется, делает именно то, что вы хотите.Поддерживайте списки как списки (но плоские).

import itertools

a = [[[[1, 2]]], [[2, 3, 4, 5]], [[[[[[134, 56]]]]]], 9, 8, 0]
res = []

for element in a:
  if isinstance(element, list):
    while len(element) == 1:
      element = list(itertools.chain(*element))
    res.append(element)
  else:
    res.append(element)

print(res)

С результатом res, равным [[1, 2], [2, 3, 4, 5], [134, 56], 9, 8, 0]

0 голосов
/ 15 февраля 2019

Я был бы склонен сделать это с помощью рекурсии: если объект представляет собой список длиной 1, удалите внешний слой;затем рекурсивно уничтожить всех своих потомков.

def unlevel(obj):
    while isinstance(obj, list) and len(obj) == 1:
        obj = obj[0]
    if isinstance(obj, list):
        return [unlevel(item) for item in obj]
    else:
        return obj

test_cases = [
    [[[3, 3]]],
    [[[3, 4], [3, 3]]],
    [[3], [4]],
    [[[3]]],
    [[[3], [3, 3]]]
]

for x in test_cases:
    print("When {} is unleveled, it becomes {}".format(x, unlevel(x)))

Результат:

When [[[3, 3]]] is unleveled, it becomes [3, 3]
When [[[3, 4], [3, 3]]] is unleveled, it becomes [[3, 4], [3, 3]]
When [[3], [4]] is unleveled, it becomes [3, 4]
When [[[3]]] is unleveled, it becomes 3
When [[[3], [3, 3]]] is unleveled, it becomes [3, [3, 3]]

Редактировать: читая ваш вопрос еще раз, я думаю, возможно, вы хотите, чтобы [[3], [4]] остался [[3], [4]].Если это так, то я интерпретирую требования, что «только снимите лишние скобки с верхнего слоя; оставьте внутренние одноэлементные списки без изменений».В этом случае вам не нужна рекурсия.Просто снимите верхний список, пока не сможете больше, а затем верните его.

def unlevel(obj):
    while isinstance(obj, list) and len(obj) == 1:
        obj = obj[0]
    return obj

test_cases = [
    [[[3, 3]]],
    [[[3, 4], [3, 3]]],
    [[3], [4]],
    [[[3]]],
    [[[3], [3, 3]]]
]

for x in test_cases:
    print("When {} is unleveled, it becomes {}".format(x, unlevel(x)))

Результат:

When [[[3, 3]]] is unleveled, it becomes [3, 3]
When [[[3, 4], [3, 3]]] is unleveled, it becomes [[3, 4], [3, 3]]
When [[3], [4]] is unleveled, it becomes [[3], [4]]
When [[[3]]] is unleveled, it becomes 3
When [[[3], [3, 3]]] is unleveled, it becomes [[3], [3, 3]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...