Попытка написать функцию map() получает ошибку IndexError: индекс списка вне допустимого диапазона

Я пытаюсь написать функцию map(), получая ошибку IndexError: индекс списка вне допустимого диапазона

     def map1(fn, a):
         i = 0
         b = []
         while i != len(a):
             print(len(a))
             i += 1
             b.append(fn(a[i]))
         return b

с рабочей функцией

    def translate(x):
        dicti = {"merry": "god", "christmas": "jul", "and": "och", "happy": "gott", "new": "nytt", "year": "år"}
        return dicti[x]

получил ошибку

     IndexError: list index out of range

person caleb farley    schedule 10.03.2015    source источник
comment
Пожалуйста, опубликуйте полную трассировку стека IndexError, чтобы можно было увидеть, где это происходит. Какие аргументы для map1() вызывают ошибку?   -  person dhke    schedule 10.03.2015


Ответы (2)


Вы увеличиваете i перед доступом к a. В последней итерации i равно len(a)-1 в начале тела цикла, затем оно увеличивается до len(a), но это выходит за допустимый диапазон индекса. Чтобы исправить это, вы должны увеличить после доступа:

while i != len(a):
    b.append(fn(a[i]))
    i += 1

Однако улучшенный способ сделать это — использовать range, который автоматически создает правильные значения для i:

for i in range(len(a)):
    b.append(fn(a[i]))

Еще лучший способ — перебрать записи a напрямую:

for x in a:
    b.append(fn(x))

Еще лучший способ — использовать понимание списка:

b = [fn(x) for x in a]
person mkrieger1    schedule 10.03.2015
comment
Это сработало, когда я его использовал, хотя я не уверен, как его настроить с помощью последней строки кода, которую вы опубликовали... - person caleb farley; 11.03.2015
comment
Вместо: def map1(fn, a): b = []; ...; return b вы делаете: def map1(fn, a): b = [fn(x) for x in a]; return b или просто def map1(fn, a): return [fn(x) for x in a] - person mkrieger1; 11.03.2015

Вы увеличили i перед его использованием.

def map1(fn, a):
         i = 0
         b = []
         while i != len(a):
             print(len(a))

             b.append(fn(a[i]))
             i += 1
         return b

def translate(x):
        dicti = {"merry": "god", "christmas": "jul", "and": "och", "happy": "gott", "new": "nytt", "year": "ar"}
        return dicti[x]

map1(translate, ["merry", "and"])
person user3181422    schedule 10.03.2015