Задача на python об изменении списка, код не меняет список

Рейтинг: -3Ответов: 1Опубликовано: 14.08.2023

Написала код по следующей задаче:

ограничение по времени на тест 1 секунда
ограничение по памяти на тест 256 мегабайт

В подарок на день рождения Мишка получил массив целых 
чисел a длины n (какая неожиданность!).

Мишке не нравится этот подарок и он хочет как-нибудь его 
изменить. Он изобрел алгоритм и назвал его «Алгоритм 
Мишки для Соседних Замен». Этот алгоритм может быть 
представлен в виде последовательности ходов:

Заменить все вхождения 1 в массиве a на 2;
Заменить все вхождения 2 в массиве a на 1;
Заменить все вхождения 3 в массиве a на 4;
Заменить все вхождения 4 в массиве a на 3;
Заменить все вхождения 5 в массиве a на 6;
Заменить все вхождения 6 в массиве a на 5;
…
Заменить все вхождения 10^9−1 в массиве 
a на 10^9;
Заменить все вхождения 10^9 в массиве 
a на 10^9−1.
Заметим, что многоточие в середине алгоритма означает, 
что Мишка применяет эти замены к каждой паре соседних чисел 
(2i−1,2i) для всех i∈{1,2,…,5⋅108}, как это описано выше.

Например, для массива a=[1,2,4,5,10]
следующая последовательность массивов описывает алгоритм:

[1,2,4,5,10]→(заменить все вхождения 1 на 2)→
[2,2,4,5,10]→(заменить все вхождения 2 на 1)→
[1,1,4,5,10]→(заменить все вхождения 3 на 4)→
[1,1,4,5,10]→(заменить все вхождения 4 на 3)→
[1,1,3,5,10]→(заменить все вхождения 5 на 6)→
[1,1,3,6,10]→(заменить все вхождения 6 на 5)→
[1,1,3,5,10]→
 …
 →
[1,1,3,5,10]→(заменить все вхождения 10 на 9)→
[1,1,3,5,9]. 
Дальнейшие шаги алгоритма не изменят массив.

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

Входные данные
Первая строка входных данных содержит одно целое 
число n(1≤n≤1000) — количество элементов в подарке 
Мишки с его дня рождения (внезапно, массиве).
Вторая строка входных данных содержит n
целых чисел a1,a2,…,an(1≤ai≤109) — элементы массива.

Выходные данные
Выведите n
целых чисел — b1,b2,…,bn, где bi
означает измененное значение i-го элемента массива a
после применения к нему «Алгоритма Мишки для Соседних 
Замен». Заметьте, что вы не можете менять порядок 
элементов массива.

Примеры
входные данные
5
1 2 4 5 10
выходные данные
1 1 3 5 9

входные данные
10
10000 10 50605065 1 5 89 5 999999999 60506056 1000000000
выходные данные
9999 9 50605065 1 5 89 5 999999999 60506055 999999999

Примечание
Первый тестовый пример разобран в условии задачи.

Мой код:

def f(s):
    a=s 
    b=[]
    q=2 
    w=1 
    while a!=b:
        c=a
        for i in c:
            if i==q:
                i=w
        a, b=c, a 
        q+=2 
        w+=2
    return a
n=int(input()) 
a=list(map(int, input().split())) 
print(*f(a))

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

Ответы

▲ 4Принят

Если я правильно понял, то достаточно такого:

n=int(input())
a=list(map(int, input().split()))
for i in range(len(a)):
    a[i] = (a[i] - 1) | 1    #получаем меньшее или равное нечетное число
print(*a)

А в вашем коде со списками ничего не делается, for i in c: как бы выбирает очередное значение из массива во временную переменную, а не является ссылкой на элемент массива.

Если требуется менять элементы массива, используйте простой цикл с a[i]