Как использовать индекс в качестве ключа в Python? - PullRequest
0 голосов
/ 05 октября 2011

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

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

Но

x [v] = 7

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

ДОБАВЛЕНО

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

x[open(v)] = 7

Ответы [ 3 ]

7 голосов
/ 05 октября 2011

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

Просто конвертируйте v в кортеж:

x[tuple(v)] = 7

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

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

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

x[(1,2,2,3)] = 7
2 голосов
/ 05 октября 2011

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
2 голосов
/ 05 октября 2011

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

x[tuple(v)]

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

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