Попеременная смена регистра букв в строке без учета пробелов и знаков препинания

Как поменять регистр букв в предложении с пробелами, чтобы эти пробелы не учитывались при очередной смене регистра. Т. е. в моем случае из "ОдИн, ДвА, ТрИ." надо получить :"ОдИн, ДвА, тРи."

def to_weird_case(string):
    num = 0
    new_word = []
    for i in string:
        if num % 2 == 0:
            num += 1
            new_word.append(i.upper())
        else:
            num += 1
            new_word.append(i.lower())
    print(''.join(new_word))

to_weird_case(input())
 

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

Автор решения: splash58

Поставьте явную проверку на пробел и сбрасывайте счетчик четности

def to_weird_case(string):
    num = 0
    new_word = []
    for i in string:
        if i == ' ':
            num = 0
            new_word.append(i)
        elif num % 2 == 0:
            num += 1
            new_word.append(i.upper())
        else:
            num += 1
            new_word.append(i.lower())
→ Ссылка
Автор решения: ganz

Применив телепатию, получил это

def to_weird_case(string):
    num = 0
    new_word = []
    for i in string:
        if i==' ': #если пробел то добавляем его в сроку и пропускаем цикл
            new_word.append(' ')
            continue
        if num % 2 == 0:
            num += 1
            new_word.append(i.upper())
        else:
            num += 1
            new_word.append(i.lower())
    print(''.join(new_word))

to_weird_case('ОдИн, ДвА, ТрИ.')
#ОдИн, дВа, тРи.
→ Ссылка
Автор решения: Namerek

Если я правильно понял задачу,

Регистр каждой следующй БУКВЫ должен отличаться от регистра предыдущей

то могу предложить такое решение:

import re
string = 'один, два, три четыре пять шесть 098988 двенадцать'
indices = [i for i, let in enumerate(string.lower()) if re.match(r'[а-я]', let)]
print(''.join(string[x].lower() if x not in indices[::2] else string[x].upper() for x in range(len(string))))
# ОдИн, ДвА, тРи ЧеТыРе ПяТь ШеСтЬ 098988 дВеНаДцАтЬ

Без re можно так:

string = 'один, два, три четыре пять шесть 098988 двенадцать'
indices = [
    i for i, let in enumerate(string.lower())
    if let in 'абвгдеёжзиклмнопрстуфхцчшщьыъэюя'
]
print(
    ''.join(
        string[x].lower() if x not in indices[::2] else string[x].upper()
        for x in range(len(string))
    )
)
# ОдИн, ДвА, тРи ЧеТыРе ПяТь ШеСтЬ 098988 дВеНаДцАтЬ
→ Ссылка
Автор решения: vadim vaduxa

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

stri = "ОдИн, ДвА, ТрИ."
from itertools import cycle
i = cycle([str.lower, str.upper] if stri.lstrip()[0].isupper() else [str.upper, str.lower])
a = ''.join(s if s in ' \t\n\r\v\f' else next(i)(s) for s in stri)
print(a)  # оДиН, ДвА, ТрИ.
def to_weird_case(stri):
    d = stri.lstrip()[0].isupper()
    for s in stri:
        if s in ' \t\n\r\v\f':
            yield s
        else:
            yield s.lower() if d else s.upper()
            d = not d

a = ''.join(to_weird_case(stri))
print(a)  # оДиН, ДвА, ТрИ.
→ Ссылка