Альтернативные буквы в строке - код не работает - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь чередовать строчные и прописные буквы.Мой текущий код такой:

def skyline (str1): 

    result = ''
    index = 0

    for i in str1:
        result  += str1[index].upper() + str1[index + 1].lower()
        index += 2

    return result

Когда я запускаю вышеуказанный код, я получаю сообщение об ошибке String index out of range.Как я могу это исправить?

Ответы [ 7 ]

0 голосов
/ 25 апреля 2018

В одну сторону, используя ниже join + enumerate:

s = 'asdfghjkl'
''.join(v.upper() if i%2==0 else v.lower() for i, v in enumerate(s))
#'AsDfGhJkL'
0 голосов
/ 22 июля 2019

Вы можете использовать следующий код:

def myfunc(str1):
    result=''
    for i in range(0,len(str1)):
        if i % 2 == 0:    
            result += str1[i].upper()
        else:     
            result += str1[i].lower()
    return result
0 голосов
/ 25 апреля 2018

Я пытался как можно меньше изменить ваш код, чтобы вы могли правильно понять.Я просто добавил цикл for с шагом 2, чтобы вы не получили индекс вне диапазона.А для последнего символа в случае строки нечетной длины я обрабатывал отдельно.

def skyline (str1): 

    result = ''
    length = len(str1)
    for index in range(0, length - 1, 2):
        result  += str1[index].upper() + str1[index + 1].lower()

    if length % 2 == 1:
        result += str1[length - 1].upper()

    return result
0 голосов
/ 25 апреля 2018

вы не проверяете, соответствует ли ваш индекс размеру вашей строки.

Было бы необходимо добавить условие, которое проверяет, всегда ли значение i меньше строки и что i% 2 == 0 и i == 0, чтобы поместить первый символ в Upper

с i% 2 == 0 мы применим верхнюю букву к двум

for i, __ in enumerate(str1):
    if i+1 < len(str1) and i % 2 == 0 or i == 0:
        result  += str1[i].upper() + str1[i + 1].lower()
0 голосов
/ 25 апреля 2018

Для каждого символа в вашей входной строке вы увеличиваете индекс на 2. Поэтому вы выходите за границы.

Попробуйте использовать длину строки для этой цели.

0 голосов
/ 25 апреля 2018

Попробуйте for i in range(len(str1)): и замените index на i в коде. После вы можете сделать

if i % 2 == 0:    result += str1[i].upper()
else:     result += str1[i].lower()
0 голосов
/ 25 апреля 2018

Я бы переписал вашу логику так:

from itertools import islice, zip_longest

def skyline(str1): 

    result = ''
    index = 0

    for i, j in zip_longest(str1[::2], islice(str1, 1, None, 2), fillvalue=''):
        result += i.upper() + j.lower()

    return result

res = skyline('hello')

'HeLlO'

Объяснение

  • Используйте itertools.zip_longest для перебора фрагментов вашей строки.
  • Используйте itertools.islice для извлечения каждого второго символа без построения отдельной строки .
  • Теперь просто выполните итерации по заархивированной итерации и добавьте, как и раньше.
...