如何使用参数作为Python中映射的关键?

时间:2016-03-30 10:43:44

标签: python dictionary

我需要将键映射到方法中的元组。关键是该方法的一个参数。我在考虑使用字典来做到这一点。但是字典中的键必须是常量,是否可以使用方法的参数作为键?如果没有,我应该使用什么数据结构来做到这一点?

1 个答案:

答案 0 :(得分:1)

如果你看一下glossary中字典的定义:

  

<强>字典   关联数组,其中任意键映射到值。 键可以是具有__hash __()和__eq __()方法的任何对象。   在Perl中称为哈希。

您将理解字典键的正确术语是 hashable (相当于常量),现在 hashable 意味着:

  

<强>可哈希

     

如果对象具有在其生命周期内永远不会更改的哈希值(它需要哈希()方法),则该对象是可清除的,并且可以是   与其他对象相比(它需要 eq ()方法)。可哈希   比较相等的对象必须具有相同的哈希值。

     

Hashability使对象可用作字典键和set成员,因为这些数据结构在内部使用哈希值。

     

所有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'