Каким образом исправить неработающее условие проверки на четность?
Доброго времени суток) Изучаю 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::2] ко всей строке, то вы получили бы все четные буквы, но что бы вы с ними потом делали в этом примере - затрудняюсь сказать. Их же еще и на соответствие букве "a" проверять надо, а затем все равно перемешивать с "_").Вот простой код с исправленным условием. Первая проверка - на четность (с учетом сдлвига на 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='')
В ответе @Сергей есть логическая ошибка. Если запустить код, то вывод должен быть: 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'