2016-03-30 4 views
1

Мне нужно сопоставить ключ с кортежем в методе. Ключ - это аргумент метода. Я думал использовать словарь для этого. Но ключ в словаре должен быть константой, хорошо ли использовать аргумент метода как ключ? Если нет, какую структуру данных я должен использовать для этого?Как использовать аргумент в качестве ключа в сопоставлении в Python?

+0

Хотите ли вы создать [обобщенную функцию запоминания или декоратор] (https://wiki.python.org/moin/PythonDecoratorLibrary#Memoize)? –

+1

Опубликовать образец вашего кода? ... И почему бы не использовать его в качестве аргумента? .. Удалили ли вы его или столкнулись с любыми проблемами? –

+0

Я просто не уверен, что аргумент можно рассматривать как константу, так как ключ должен быть константой. – CsIsFun

ответ

1

Если посмотреть на определение словаря в 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'