Мне нужно сопоставить ключ с кортежем в методе. Ключ - это аргумент метода. Я думал использовать словарь для этого. Но ключ в словаре должен быть константой, хорошо ли использовать аргумент метода как ключ? Если нет, какую структуру данных я должен использовать для этого?Как использовать аргумент в качестве ключа в сопоставлении в Python?
ответ
Если посмотреть на определение словаря в glossary:
словарь ассоциативный массив, где произвольные ключи отображенной на значения. Ключами могут быть любые объекты с методами __hash __() и __eq __(). Вызывается хеш в Perl.
Вы поймете, что правильный термин для словаря ключ должен быть hashable (эквивалентно постоянной), что теперь hashable означает:
hashable
объект hashable, если он имеет хеш-значение, которое никогда не изменяется в течение его жизненного цикла (ему нужен метод hash()) и может быть по сравнению с другими объектами (ему нужен метод eq()). Hashable объекты, которые сравнивают одинаковые, должны иметь одно и то же значение хэш-функции.
Hashability позволяет использовать объект как ключ словаря и элемент набора, поскольку эти структуры данных используют внутреннее значение хэш-функции.
Все неизменные встроенные объекты Python являются хешируемыми, в то время как не изменяются контейнеры (например, списки или словари). Объекты, которые являются экземплярами пользовательских классов, по умолчанию хешируются; они все сравниваются неравномерно (кроме самих себя), а их хэш-значение - , полученных из их id().
Так, например:
>>> d = {}
>>> for k,v in zip(range(5), 'TESTS'): #intergers are hashable
d[k] = v
>>>
>>> d
{0: 'T', 1: 'E', 2: 'S', 3: 'T', 4: 'S'}
>>>
>>> l = [[0], [1], [2], [3], [4]]
>>> for k,v in zip(l, 'TESTS'):
d[k] = v
Traceback (most recent call last):
File "<pyshell#610>", line 2, in <module>
d[k] = v
TypeError: unhashable type: 'list'
Наконец, полагая, что в тестовом случай:
>>> def make_dict(k_list, v_list):
d = {}
for k,v in zip(k_list, v_list):
d[k] = v
return d
>>> make_dict(range(5), 'TESTS')
{0: 'T', 1: 'E', 2: 'S', 3: 'T', 4: 'S'}
>>>
>>>
>>> l = [[0], [1], [2], [3], [4]]
>>>
>>> make_dict(l, 'TESTS')
Traceback (most recent call last):
File "<pyshell#607>", line 1, in <module>
make_dict(l, 'TESTS')
File "<pyshell#601>", line 4, in make_dict
d[k] = v
TypeError: unhashable type: 'list'
Хотите ли вы создать [обобщенную функцию запоминания или декоратор] (https://wiki.python.org/moin/PythonDecoratorLibrary#Memoize)? –
Опубликовать образец вашего кода? ... И почему бы не использовать его в качестве аргумента? .. Удалили ли вы его или столкнулись с любыми проблемами? –
Я просто не уверен, что аргумент можно рассматривать как константу, так как ключ должен быть константой. – CsIsFun