Почему я не могу получить доступ к списку по его ключу в Python?

Я создаю список, а затем обращаюсь к элементу вроде этого:

list = [] list.insert(42, "foo") list.insert(43, "bar") list.insert(44, "baz") print(list[43]) 

И у меня есть следующая ошибка:

print (list [43]) IndexError: индекс индекса вне диапазона

Что не так ? Должен ли я использовать словарь для этого?

В списке нет «ключей», есть только индексы.

Причина, по которой ваш код не работает так, как вы ожидаете, заключается в том, что list.insert(index, obj) не list.insert(index, obj) список «пустыми» элементами, когда index находится за концом списка; он просто добавляет obj к списку.

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

 In [14]: d = {} In [15]: d[42] = "foo" In [16]: d[43] = "bar" In [17]: d[44] = "baz" In [18]: print(d[43]) bar 

Кроме того, вы можете предварительно инициализировать свой список с достаточно большим количеством записей:

 In [19]: l = [None] * 50 In [20]: l[42] = "foo" In [21]: l[43] = "bar" In [22]: l[44] = "bar" In [23]: print(l[43]) bar 

PS Я рекомендую вам не вызывать list переменных, поскольку он затеняет list() встроенный.

Ошибка заключается в том, что список [41] не существует.

Это будет работать только в том случае, если присутствует список [41], и в случае, если это последний элемент list.insert (42, «foo») эквивалентен list.append («foo»), иначе, если в списке есть намного больше элементов, значения будут вставлены в середину

Я неправильно понял, что такое list.insert(i, x) . Он не заменяет элемент в i м положении, но вставляет элемент в это положение, сдвигая остальные . Если i й элемент не существует, элемент вставляется в конец списка.

Этот пример иллюстрирует это:

 list = [] list.insert(42, "foo") list.insert(43, "bar") list.insert(44, "baz") list.insert(43, "qux") # qux is after baz, because baz in in fact at the index 2. print(list) list.insert(3, "test") # test is inserted between baz and qux, # because baz is at index 2 and qux at index 3. print(list) 

вывод:

 ['foo', 'bar', 'baz', 'qux'] ['foo', 'bar', 'baz', 'test', 'qux'] 

Пример Codepad

Да, для этого вам нужно использовать словарь. В списке всегда есть последовательные индексы, начиная с 0.

Да, у вас есть список кортежей, ни один из них не задействован

print (list [1]) работал бы, но это не то, что вы хотите сделать.