Перебор строки в 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 шт):

Автор решения: Zhihar
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)]
→ Ссылка
Автор решения: splash58

Можно воспользоваться функцией zip, добавив во второй срез подчеркивание. Оно попадет в результат только при нечетной длине

 def solution(s):
    return [a+b for a,b in zip(s[::2], s[1::2]+'_')]
print(solution('abcde'))
→ Ссылка
Автор решения: SergFSM

Починить ваш второй код (без проверки на четность) можно так:

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_']
→ Ссылка