Как изменить регистр для альтернативных букв строки - PullRequest
0 голосов
/ 05 сентября 2018

Я хотел бы перевести все остальные буквы строки в верхний регистр. Например, если входное значение равно 'ahdjeryu', результат должен быть 'AhDjErYu'.

Я пытался это:

def mycode(letters):
    myword = letters.split()
    for i in letters:
        if i%2 == 0:
            return i.upper()
        else:
            return i.lower()
print(mycode('ahdjeryu'))

Ошибка выдается как: if i%2==0:

TypeError: не все аргументы преобразованы во время форматирования строки

Ответы [ 4 ]

0 голосов
/ 05 сентября 2018

@ Абхи, это соответствует твоей оригинальной логике. Вам нужно r, чтобы получить индекс букв в строке.

def mycode(letters):
    for ch in letters:
        r=letters.index(ch)
        if r%2 == 0:
                letters=letters.replace(ch,letters[r].upper())
        else:
                letters=letters.replace(ch,letters[r].lower())      
    return letters
print(mycode('ahdjeryu'))
0 голосов
/ 05 сентября 2018

Несколько проблем с вашим кодом:

  1. Вам нужно только использовать str.split для удаления пробелов. Здесь не обязательно.
  2. Чтобы извлечь индекс буквы и буквы, используйте enumerate.
  3. return вернет только одну букву. Вместо этого вы можете yield буквы, а затем использовать str.join на генераторе.

Вот рабочий пример:

def mycode(letters):
    for idx, i in enumerate(letters):
        if idx % 2 == 0:
            yield i.upper()
        else:
            yield i.lower()

print(''.join(mycode('ahdjeryu')))

AhDjErYu

Вышеприведенная логика может быть эквивалентно реализована посредством понимания генератора:

res = ''.join(i.upper() if idx % 2 == 0 else i.lower() for idx, i in enumerate(letters))
0 голосов
/ 05 сентября 2018

Да, это ошибка, причина i теперь является буквой, а не числом, поэтому она не может мод для 2.

Я не уверен в синтаксисе зацикливания for в Python, но вы можете попробовать:

    cnt = 0 
    for i in letters:
        if cnt%2 == 0:
            return i.upper()
        else:
            return i.lower()
        cnt++

Надеюсь, это поможет вам!

Исправь меня, если я ошибаюсь. Спасибо

0 голосов
/ 05 сентября 2018

Ваш i является строкой из одного символа, а не индексом. Так что вы не можете сделать i%2. Используйте enumerate, чтобы получить индекс и значение.

alternating = ''.join(letter.upper() if index%2==0 else letter.lower() for index, letter in enumerate(text) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...