Как использовать индекс в качестве ключа в Python?

#python #list #dictionary #key #assign

#python #Список #словарь #Клавиша #назначить

Вопрос:

У меня есть список: v = [1,2,2,3] . Я хотел бы использовать этот список в качестве ключа. Я могу сделать это «вручную»:

 x = {}
x[1,2,2,3] = 7
  

Но

x[v] = 7

не работает. Какой самый простой способ сделать то, что мне нужно сделать?

ДОБАВЛЕНО

Я представляю себе решение как нечто подобное:

 x[open(v)] = 7
  

Комментарии:

1. ну, это, конечно, не open() так; это будет пытаться прочитать файл с именем [1,2,2,3] и поскольку списки не являются строками…

Ответ №1:

Проблема в том, что ключи должны быть неизменяемыми, а списки — нет. Кортежи, однако, есть.

Просто преобразуйте v в кортеж:

 x[tuple(v)] = 7
  

Чтобы уточнить, вышесказанное совпадает с написанием

 x[1,2,2,3] = 7
  

и последнее является синтаксическим вариантом

 x[(1,2,2,3)] = 7
  

Комментарии:

1. немного развивая это; когда вы говорите x[1,2,2,3] , что вы вообще не индексируете по списку, это не то же самое, что: x.__getitem__([1,2,2,3]) , скорее, это x.__getitem__((1,2,2,3)) несмотря [] на

Ответ №2:

В Python есть две похожие структуры данных для хранения списков значений. list является изменяемой версией: ее значения могут быть изменены.

 x = [1, 2, 2, 3]
x = list((1, 2, 3, 4))
  

tuple является неизменяемой версией. После создания его значение нельзя изменить.

 x = 1, 2, 2, 3
x = (1, 2, 2, 3)
x = tuple((1, 2, 2, 3))
  

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

 x[tuple(v)] = 7
  

Ответ №3:

Ключи Dict должны быть хешируемыми. Списки не являются хешируемыми, но кортежи являются. (Значение хэша объекта никогда не должно меняться в течение срока службы объекта. Более того, два хэшируемых объекта, которые сравниваются равными, должны иметь одинаковый хэш. Поскольку списки изменчивы, единственный способ удовлетворить оба условия — заставить все списки возвращать одно и то же хэш-значение. Вместо того, чтобы разрешать это и искажать назначение хэшей, Python делает все изменяемые контейнеры недоступными для хэширования.)

 x[tuple(v)]
  

x[1,2,2,3] работает, потому что кортеж обозначается запятыми, а не круглыми скобками:

 In [78]: 1,2,2,3
Out[78]: (1, 2, 2, 3)