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