изменение вложенного списка в python - PullRequest
0 голосов
/ 03 августа 2020

Здравствуйте, я пытаюсь преобразовать вложенные списки в обратном порядке.

вот мой код:

def reverse_(items):
     items =  items[::-1]
        new_l = []
        for item in items:
            if type(item) == list:
                item.reverse()
                new_l.append(item)
            else:
                new_l.append(item)
        return new_l
  1. print(reverse_reversed([1, [2, 3, 4, 'yeah'], 5] )) возвращает: [5, ['yeah', 4, 3, 2], 1] который правильно

  2. но print(reverse_reversed([42, [99, [17, [33, ['boo!']]]]]) возвращает: [[[17, [33, ['boo!']]], 99], 42] который должен быть таким: [[[[['boo!'], 33], 17], 99], 42]

Ответы [ 3 ]

1 голос
/ 03 августа 2020

Похоже, вы хотите перевернуть списки рекурсивно , а не только один раз вложенными. Это означает, что вам нужно выполнить рекурсивный вызов функции, то есть она должна вызывать сама себя.

def recursive_reversed(items):
    if isinstance(items, list):
        return [recursive_reversed(item) for item in reversed(items)]
    return items

Примечания:

  1. Я использовал проверку isinstance вместо type(item) == . Обычно это то, что вы хотите, и это означает, что подклассы list также будут перевернуты (хотя они будут обычными списками).
  2. Никаких дополнительных копий не делается: reversed выполняет итерацию по исходному списку в обратном порядке порядок.
  3. Ничего не изменилось на обратное: если вы посмотрите на содержимое исходного списка после вызова своей реализации, вы увидите, что его подсписки также были перевернуты.
  4. Я использовал понимание списка, которое обычно предпочтительнее, чем «создавать пустой список, l oop над чем-то еще, добавляя что-нибудь к этому списку на каждой итерации».
  5. Моя функция вызывает себя как форму разделения и властвования.
0 голосов
/ 03 августа 2020

Если вам действительно не нужна перевернутая копия, а нужно только перевернуть саму структуру:

def reverse(items):
    if isinstance(items, list):
        items.reverse()
        for item in items:
            reverse(item)

Демо:

>>> a = [42, [99, [17, [33, ['boo!']]]]]
>>> reverse(a)
>>> a
[[[[['boo!'], 33], 17], 99], 42]

Вы также можете закончить его с помощью return items, чтобы получить результат:

>>> reverse([42, [99, [17, [33, ['boo!']]]]])
[[[[['boo!'], 33], 17], 99], 42]

Хотя и изменение, и возврат несколько необычны, и некоторым это не понравится.

0 голосов
/ 03 августа 2020

Это потому, что вы выполняете items[::-1], что приводит к тому, что список заканчивается так: [[99, [17, [33, ['boo!']]]], 42] И, как вы можете видеть, в вашем списке только два элемента [99, [17, [33, ['boo!']]]] и 42. Итак, вы новичок. Если в списке больше списков, вам нужно будет проверить, повторяете ли вы, нет ли в вашем списке необратимых списков. Но этого не сделаешь простым для l oop.

...