Перебор строки в python
Есть задача. Нужно проверить если количество элементов в строке четное, то разбить ее на подстроки по 2 элемента в каждой, если строка содержит нечетное количество символов, она должна заменить отсутствующий второй символ последней пары подчеркиванием ('_').
Подскажите пожалуйста, в чем отличие 1 кода от 1? Почему 1 работает, а 1 нет.
1:
def solution(s):
n = 2
s = [s[index : index + n] for index in range(0, len(s), n)]
return s
print(solution('abcd')) # здесь только получаю `ab`, `cd` не видит
2:
def solution(s):
n = 2
for i in range(0,len(s),n):
s = [s[i:i+n]]
return s
print(solution('abcd'))
но тут еще не получается сделать проверку на нечетность.
Ответы (3 шт):
def solution(text):
if len(text) % 2 != 0:
text = text + "_"
return [text[i:i+2] for i in range(0, len(text), 2)]
print(solution('abcd'))
print(solution('abcde'))
можно и в 1 строку:
def solution(text):
return [((text + "_") if len(text) % 2 else text)[i:i+2] for i in range(0, len((text + "_") if len(text) % 2 else text), 2)]
Можно воспользоваться функцией zip, добавив во второй срез подчеркивание. Оно попадет в результат только при нечетной длине
def solution(s):
return [a+b for a,b in zip(s[::2], s[1::2]+'_')]
print(solution('abcde'))
Починить ваш второй код (без проверки на четность) можно так:
def solution(s):
n = 2
res = []
for i in range(0,len(s),n):
res += [s[i:i+n]]
return res
Ну и в коллекцию к уже предложенным решениям еще одно, рекурсивное. Вам, скорее всего, такое не нужно, но как вариант, думаю, пойдет:
solution = lambda s: [s[:2]] + solution(s[2:]) if len(s)>1 else (s and [s+'_'] or [])
print(solution('abcde')) # ['ab', 'cd', 'e_']