@Hikikomori91

Почему не меняется первый символ?

Добрый вечер. изучаю Пайтон, Есть код:
def test_funct(*args):
    args_ = []
    for i in range(len(args)):
        if i == 0:
            args_.append([str(elem.lower().replace(elem[0], elem[0].upper(), 1)) for elem in (str(args[i]).split())])
    return args_

print (test_funct("Ya LOMAL steklo"))


По задумке, этот код должен превращать вводные данные в лист, разбитый по пробелам, и каждый элемент этого листа низвести до нижнего регистра, а потом первый символ возвести в верхний. На выход я получаю вот это:
[['ya', 'lomal', 'Steklo']]
Когда должно получиться это:
[['Ya', 'Lomal', 'Steklo']]
Почему так происходит? Я могу сделать реплейсы символов отдельной функцией, уже после того, как будет создан лист, но это лишняя строчка. Как мне изменить текущий код без добавления новых функций?
  • Вопрос задан
  • 244 просмотра
Решения вопроса 1
Почему бы, действительно, не разбить? У вас же даже больше 80 символов строка получается. Это уже не по pep8, трудно читаемо - и все такое.

Ну а что касается вопроса. Получается так, что replace берет первый символ из исходной строки, а затем ищет его уже в той, в которой все символы были переведены в нижний регистр и, естественно, его там не находит в первых двух случаях.
Добавьте lower к первому аргументу replace
elem.lower().replace(elem[0].lower(), elem[0].upper(), 1)

или вообще используйте срезы
elem[0].upper() + elem[1:].lower()
а еще в Питоне есть встроенный метод title() у строк, который делает практически то же самое.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@vilgeforce
Раздолбай и программист
Разбиение вашей главной строки на несколько более простых и понятных и использование отадчика/вывода промежуточных результатов должны помочь.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы