#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)