Как поменять местами соседние элементы в списке?

Хочу для списка реализовать обмен значений соседних элементов.
То есть, значениями обмениваются элементы с индексами 0 и 1, 2 и 3 и т.д..
При нечетном количестве элементов последний сохранить на своем месте.

Для заполнения списка элементов необходимо использовать функцию input().

l = list(input("Введите элементы списка: "))
l[::2], l[1::2] = l[1::2], l[::2]
print(l)

Если без input(), то все работает.


Ответы (3 шт):

Автор решения: CrazyElf

Во-первых нужно правильно разделять вводимые элементы в список. Вы разделяете каждый введённый символ, а обычно вводимые данные разделяют по пробелам. Во-вторых размер срезов у вас будет разный, а нужно сделать их одинаковым, чтобы не было ошибки. Если вы отрезаете один элемент спереди у одного среза, то у другого надо отрезать один элемент с конца, тогда они получатся одинаковыми и при чётной длине списка и при нечётной:

l = input("Введите элементы списка: ").split()
l[:-1:2], l[1::2] = l[1::2], l[:-1:2]
print(l)
→ Ссылка
Автор решения: Jack_oS

Как вариант, возможно, c несколько большей читабельностью:

my_list = input("Введите элементы списка: ").split()

for i in range(0, len(my_list)-1, 2):
    my_list[i], my_list[i+1] = my_list[i+1], my_list[i]

print(my_list)

при

Введите элементы списка: >? 2 1 4 3 6 5 7

выведет:

['1', '2', '3', '4', '5', '6', '7']
→ Ссылка
Автор решения: GrAnd

Ну и вариант который вообще не читабелен. :)

lst_in = input("Введите элементы списка: ").split()
lst_out = sum(list(zip(*list(zip(*zip(*[iter(lst_in+[lst_in[-1]])]*2)))[::-1])),())[:len(lst_in)]
print(lst_out)
→ Ссылка