2016-02-28 2 views
-1

Я практикуя кодирование на codingbat.com, так как я полный новичок в Python, и вот один из упражнений:Ошибка: индекс строки из диапазона определения функции

Дана строка, возврат новая строка, сделанная из каждого другого символа, начинающегося с первого, поэтому «Hello» дает «Hlo».

Вот моя попытка определения функции string_bits (НТР):

def string_bits(str): 
    char = 0 
    first = str[char] 
    for char in range(len(str)): 
    char += 2 
    every_other = str[char] 
return (first + every_other) 

Выполнение кода выдает ошибку. Что случилось с моим кодом?

+3

... указательный строка находится вне диапазона. Это не должно удивлять, учитывая, что вы повторяете последний индекс * и добавляете два к нему *. – jonrsharpe

+0

@jonrsharpe Я думаю, что IndexError возникает, когда «char» равен индексу _penultimate_ (поскольку мы добавляем 2). – pie

ответ

2

Другой подход, с объяснением:

Если вам нужно обработать предложение, в котором будут включены пробелы, вы можете сделать это, используя нарезку. На строку нарезка работает:

[start_of_string:end_of_string:jump_this_many_char_in_string] 

Итак, вы хотите, чтобы перейти только каждую вторую букву, так что вы делаете:

[::2] 

Первые две пустые, потому что вы просто хотите выйти каждую секунду персонаж.

Таким образом, вы можете сделать это в одной строке, например:

>>> " ".join(i[::2] for i in "Hello World".split()) 
'Hlo Wrd' 

Что произошло выше, мы берем строку, используйте split, чтобы сделать его список. Раскол по умолчанию будет разделен на пространстве, таким образом, мы будем иметь:

["Hello", "World"] 

Тогда, что мы будем делать оттуда, использует понимание, итерацию по каждому пункту списка, который даст нам слово в то время, и оттуда мы выполним требуемую манипуляцию с строкой за i[::2].

Понимание является: (documentation)

i[::2] for i in "Hello World".split() 

Наконец, мы называем "".join (doc), который теперь будет меняться наш список обратно в строку, чтобы наконец дать нам выход:

"Hlo Wrd" 

Ознакомьтесь с разделом нарезки из документов: https://docs.python.org/3/tutorial/introduction.html

+0

Очень полезное и четкое объяснение. Нарезка делает код намного проще – tupitupa

+0

@tupitupa Рад, что это помогло. Удачи вам в обучении. – idjaw

1

Проблема состоит в том, что char + = 2 возвращает значение больше len (str), поскольку len (str) -1 (диапазон) + 2 длиннее строки. Вы можете сделать:

def string_bits(string): 

    if len(string) == 2: 
     return string[0] 

    result = '' 
    for char in range(0,len(string),2):#range created value sin increments of two 
     result += string[char] 
    return result 

Более емким метод был бы:

def string_bits(string): 
    return string[::2] 

Вы должны избегать использования «ул» в качестве имени переменной, как это зарезервированное слово на Python.

0

Ошибка, которую вы получаете, означает, что вы пытаетесь получить n-ю букву строки с числом символов менее n.

0

В качестве другого предложения, строки являются типами последовательностей в Python, что означает, что у них есть много встроенных функций для выполнения именно того, что вы пытаетесь сделать здесь. См. Built-in Types - Python для получения дополнительной информации, но знайте, что типы последовательностей поддерживают срез - то есть выбор элементов из последовательности.

Таким образом, вы можете порезать вашу строку, как это:

def string_bits(input_string): 
    return input_string[::2] 

Значение "взять мой input_string с самого начала (:) до конца (:) и выберите каждый второй (2) элемент"

1

ОК, для меня:

  1. Не следует использовать ул в качестве имени переменной, как это встроенная функция питона (заменить ул на my_str, например)
  2. Например, длина «Hello» 5, так что 0 < = индекс < = 4. Здесь вы пытаетесь получить доступ к индексу 3 + 2 = 5 (когда char = 3) в цикле for.

Вы можете добиться того, что вы хотите с помощью следующего кода:

def string_bits(my_str): 
    result = "" 
    for char in range(0, len(my_str), 2): 
    result += my_str[char] 
    return result 
Смежные вопросы