Каким образом исправить неработающее условие проверки на четность?

Доброго времени суток) Изучаю python самостоятельно и столкнулся в проблемкой в задаче(((

Задача:
Создайте любую переменную строку и поместите туда любой текст. Сделайте так, чтобы все нечетные по порядку слева на право символы стали “_”, а все символы, местоположение которых четное и которые равны “a” - стали “b”. Например, для фразы “Ham is tasty” => "_b _s_t_s_y"

Мой код :

    valuet = "Ham is tasty"
    for char in valuet:
        if char [1::2]:
            print("_",end='')
        elif char [::2] and char == "a":
            print("b",end='')    
        else:
            print(char,end='')

Не могу разобраться почему не отрабатывает первое условие if на нечетность?(((
И что можно подправить, чтобы работало условие?


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

Автор решения: Сергей

Общая рекомендация: многие относятся к программированию, как к магии (типа: "произнес непонятную формулу (=переписал кусок непонятного кода), махнул палочкой (=нажал Enter), и какие-то силы все сделали"). Это путь в никуда. Разбирайтесь в каждом шаге, который вы включаете в код (как на этапе обучения, так и в дальнейшем).

В частности:

  1. Мне сложно понять, по какой логике вы предположили, что применение среза к одному символу как-то поможет увидеть четность, потому объяснение будет коротким: применять срез к одному символу вообще не имеет смысла.
    Рекомендация: перечитайте, что такое срезы.
    (Если бы вы применили срез [1::2] ко всей строке, то вы получили бы все четные буквы, но что бы вы с ними потом делали в этом примере - затрудняюсь сказать. Их же еще и на соответствие букве "a" проверять надо, а затем все равно перемешивать с "_").

  2. Вот простой код с исправленным условием. Первая проверка - на четность (с учетом сдлвига на 1 из-за отсчета с 0) и на "a", если не сработает - на остальную четность, оставшийся случай - нечетный. С ответом из примера ответ не совпадет, но как вы написали - у вас ответ неверный (возможно, тут вы тоже что-то не так поняли).

valuet = "Ham is tasty"
for i in range(len(valuet)):
    if i % 2 != 0 and valuet[i] == "a":
        print("b", end='')
    elif i % 2 != 0:
         print(valuet[i],end='')
    else:
        print("_",end='')
→ Ссылка
Автор решения: Be3y4uu_K0T

В ответе @Сергей есть логическая ошибка. Если запустить код, то вывод должен быть: Ham is tasty => _b _s_t_s_y, а так получается: H_m_i_ _b_t_. Это получается, потому что счет ведется с 0, а не с 1. Для удобства лучше использовать встроенную функцию enumerate(iterable, start=0).

Пример использования:

>>> seasons = ['Spring', 'Summer', 'Fall', 'Winter']
>>> list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
>>> list(enumerate(seasons, start=1))
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]

Решением будет:

>>> valuet = 'Ham is tasty'
>>> for index, char in enumerate(valuet, start=1):
...     if index % 2 == 0 and char == 'a':
...             print('b', end='')
...     elif index % 2 == 0:
...             print(char, end='')
...     else:
...             print('_', end='')
... 
_b_ _s_t_s_y

Однострочный вариант:

>>> valuet = 'Ham is tasty'
>>> new_valuet = ''.join(char if index % 2 else '_' for index, char in enumerate(valuet.replace('a', 'b')))
>>> new_valuet
'_b_ _s_t_s_y'
→ Ссылка