Как переместить элементы с четным индексом в конец списка

lst = ['apple', 'orange', 'kiwi', 'ananas',
       'tea', 'coffee', 'milk', 'love', 'peace']

for i in range(len(lst)):
    if (i + 1) % 2 == 0:
        lst.append(lst[i])
        lst.pop(i)

В основном здесь я хочу, чтобы элементы с четным индексом добавлялись в конец этого списка. это работает для второго элемента, но все еще не для остальных

подсказка: когда вы выталкиваете элемент из середины списка, что происходит с остальными?

Adam.Er8 17.05.2022 08:44

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

Freddy Mcloughlan 17.05.2022 08:46

индекс изменения другого элемента

Bilel Bibou 17.05.2022 08:46

я очень ценю вашу помощь, ребята, я пытался вытащить его и добавить в конец списка

Bilel Bibou 17.05.2022 08:47

@FreddyMcloughlan, вы имеете в виду извлечь в новый список?

Bilel Bibou 17.05.2022 08:49

Бинго, индекс элементов меняется. Поэтому либо учитывайте это при расчете следующего индекса, либо начинайте с самого большого индекса, а не с самого низкого.

Aran-Fey 17.05.2022 08:49

@closers: вы заметили, что предоставленный код не повторяет список? Текущий код действительно неверен, и советы, найденные в предложенном дубликате, относятся к проблеме, но не к коду...

Serge Ballesta 17.05.2022 08:50

@blhsing Я не большой поклонник этого дубликата, тем более что есть действительное решение, повторяющее от 1 до половины длины списка, добавляя и выталкивая по пути.

Robby Cornelissen 17.05.2022 08:53

@Aran-Fey Аран-Фей, я не могу найти способ или шаблон для расчета следующего измененного индекса, не могли бы вы помочь?

Bilel Bibou 17.05.2022 08:53

я действительно не мог найти способ

Bilel Bibou 17.05.2022 08:55

Я настоятельно рекомендую прочитать главу официального учебника по Python, посвященную for-loops: docs.python.org/3/tutorial/controlflow.html#for-statements ; одна из самых первых упомянутых вещей: Код, который изменяет коллекцию во время итерации по той же самой коллекции, может быть сложно сделать правильно. Вместо этого обычно проще перебрать копию коллекции или создать новую коллекцию:. А затем он дает примеры того, как сделать эти два подхода. Не используйте lst.append или lst.pop внутри for-цикла, который повторяет lst!

Stef 17.05.2022 09:56
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
1
11
53
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Простым способом было бы создать новый список, используя понимания:

lst2 = [v for i, v in enumerate(lst) if i%2 == 0] + \
       [v for i, v in enumerate(lst) if i%2 != 0]

Но можно изменить список на месте. Правило — начинать с конца списка, чтобы не изменять нечетность индексов при удалении элемента.

last = len(lst) - 1   # when an element is popped, the list loses one element
for i in range(len(lst), 0, -1):
    if (i % 2) == 0:
        val = lst.pop(i - 1)       # remove element with even index
        lst.insert(last, val)      # insert it before last inserted
        last -= 1

это круто, братан, действительно большое тебе спасибо, это действительно помогает, я очень ценю это, спасибо, митинг ?✌?❤️

Bilel Bibou 17.05.2022 09:18

@BilelBibou: Пожалуйста, не забудьте принять ответ, если вам больше не нужна помощь с этим вопросом.

Serge Ballesta 17.05.2022 09:30

да, конечно, но как я это делаю, почему-то я не могу

Bilel Bibou 17.05.2022 09:35

@LancelotduLac это так, я хотел индексы, а не значение, и это единственный ответ (2-я часть), который решает мой подход, меня не волнует значение, меня волнуют индексы значений, понял?

Bilel Bibou 17.05.2022 09:51

Проблема с вашим подходом заключается в том, что элементы смещаются после того, как вы переместили первый элемент. Поэтому, когда вы находитесь у следующего элемента с «четным» индексом, этот элемент изначально был с нечетным индексом. Таким образом, после того, как вы сдвинете первый элемент, вы можете просто продолжить работу с элементом по следующему индексу, который ранее находился на расстоянии два индексов, затем снова со следующим и так далее для половина индексов в списке.

Вот пример использования списка чисел, чтобы было легче увидеть, что происходит. Если вам нужны нечетные индексы, используйте range(1, len(lst)//2+1).

lst = list(range(10))
for i in range(len(lst)//2):
    lst.append(lst.pop(i))
# [1, 3, 5, 7, 9, 0, 2, 4, 6, 8]

Однако, даже если это работает, изменение списка во время его итерации, как правило, очень плохая идея, приводящая ко многим головным болям. Кроме того, повторение pop(i) делает всю операцию O(n²).

Вместо этого было бы намного быстрее и разумнее просто объединить два фрагмента списка:

lst = list(range(10))
lst = lst[1::2] + lst[0::2]
# [1, 3, 5, 7, 9, 0, 2, 4, 6, 8]

(Если вам нужно изменить список «на месте», например, из-за других ссылок, указывающих на этот список, вы можете заменить содержимое списка, используя назначение фрагмента: lst[:] = .... Это все равно не будет «на месте». " в смысле не использовать дополнительную память. Но если список настолько велик, что это проблема, то время работы O(n²), вероятно, в любом случае будет большей проблемой.)

спасибо большое, тоже очень помогает

Bilel Bibou 17.05.2022 10:02

Вы можете использовать диапазоны более широких шагов Python:

lst = lst[1::2] + lst[0::2]

В правой части плюса написано «захватить каждый 2-й элемент, начиная с первого», а в левой части написано «захватить каждый 2-й элемент, начиная со второго». Это в основном восстанавливает список с нечетными элементами в первую очередь и последними четными элементами.

Он даже избегает дорогостоящих всплывающих окон, которые делают ваш эталонный алгоритм O (n ^ 2)

спасибо, братан, но я хотел работать с этим списком, используя pop и insert или append

Bilel Bibou 17.05.2022 09:55

Другие вопросы по теме