Почему не работает вывод слова "волной"?

def wave(people):
    s=[]
    for i in range(len(people)):
        s.append(people.replace(people[i], chr(ord(people[i])-32)))
    return s
print(wave('hello') 

Вместо ожидаемого:

['Hello', 'hEllo', 'heLlo', 'helLo', 'hellO']

получаю:

['Hello', 'hEllo', 'heLLo', 'heLLo', 'hellO']


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

Автор решения: Oopss
def wave(w):
    s=[]
    for n in range(len(w)):
        s.append(w[:n]+w[n].upper()+w[n+1:])
    return s
print(wave('hello'))

или тоже самое

def wave(w):
    return [w[:n]+w[n].upper()+w[n+1:] for n in range(len(w))]

print(wave('hello'))

['Hello', 'hEllo', 'heLlo', 'helLo', 'hellO']

str.replace()

Все l заменяются на L, если там было бы 3 L все бы заменились. Например:

print('helllllow'.replace('l','L'))

heLLLLLow
→ Ссылка
Автор решения: AnnaBazueva

Вы не обработали крайний случай — одинаковые символы.

Это просто:

w = 'hellol'
print([w[:i] + w[i:].replace(c, c.upper(), 1) for i, c in enumerate(w)])

output:

(.venv) PS C:\KWORK> 
['Hellol', 'hEllol', 'heLlol', 'helLol', 'hellOl', 'helloL']

Аргумент count для метода replace позволяет регулировать кол-во заменяемых символов.

→ Ссылка
Автор решения: Швеев Алексей

Каждый раз заменяя people[i] на people[i]-32 в подстроке people вы заменяете все вхождения данного символа в этой строке.

Например доходя до буквы people[2] (l) вы заменяете все буквы l в слове Hello на L получая HeLLo, когда в вашем случае надо заменять только букву под индексом 2

Так же для получения заглавного варианта буквы будем использовать метод .upper()

def wave(people):
    s=[]
    for i in range(len(people)):
        # Создаём новую строку:
        # "{всё до символа i}{заглавный символ под i}{всё после символа i}"
        newStr = f"{people[:i]}{people[i].upper()}{people[i+1:]}"
        s.append(newStr)
    return s
print(wave('hello'))

Ну и более сокращённый код вам уже предоставляли в других ответах

→ Ссылка