Olá, Apollo. Como vai?
O seu código ficou excelente! Você resolveu o desafio de forma muito lógica e estruturada. A escolha de usar a condicional if incorreto in lista: antes de realizar as operações é uma ótima prática de programação defensiva, pois evita que o programa sofra uma quebra fatal (runtime error) caso o usuário digite um nome que não existe na lista.
A sua sequência de manipulação de índices também foi muito bem pensada: encontrar a posição com .index(), remover o elemento antigo com .remove() e inserir o novo na mesma vaga com .insert(). O algoritmo funciona perfeitamente e cumpre o objetivo de forma impecável!
Uma alternativa mais direta: Substituição por Índice
Como você está estudando as estruturas de dados no Python, vale a pena conhecer uma abordagem que atinge exatamente o mesmo resultado, mas de forma mais direta e performática.
Em Python, quando já sabemos o índice (a posição) de um elemento em uma lista, podemos alterar o valor desse elemento diretamente usando o operador de atribuição (=), sem a necessidade de remover e inserir um novo elemento em duas etapas separadas.
Veja como o miolo do seu código if ficaria utilizando essa técnica:
lista = ['carlos', 'maria', 'pedro', 'joana']
print(f'Lista original {lista}')
incorreto = input('Digite o nome incorreto: ')
if incorreto in lista:
correto = input('Digite o nome correto: ')
# 1. Descobrimos a posição do nome incorreto
posicao = lista.index(incorreto)
# 2. Substituímos o valor diretamente naquela posição da memória
lista[posicao] = correto
print(f'O nome {incorreto}, foi substituído por {correto}')
print(f'Lista atualizada: {lista}')
else:
print('Nome não encontrado.')
Por que a atribuição direta é uma boa prática?
Por trás dos panos, quando você usa os métodos .remove() e .insert(), o Python precisa fazer um esforço extra na memória: ele remove o item, reorganiza todas as posições seguintes da lista e, depois, empurra todo mundo de novo para abrir espaço para o .insert().
Ao usar a atribuição direta lista[posicao] = correto, o Python apenas substitui o valor que está guardado naquela "caixinha" específica da memória, mantendo todos os outros elementos intactos e intocados. Em listas gigantescas (como o cadastro de todos os atletas de uma maratona nacional, por exemplo), essa pequena diferença de abordagem economiza bastante processamento.
Parabéns pela excelente estrutura do desafio e por compartilhar sua solução com a comunidade do fórum!
Espero que possa ter lhe ajudado!