如何在Python 3 中使用列表作为字典的键?
在Python中,我们使用字典来检查项目是否存在。字典使用key:value对来搜索 key 是否存在,如果 key 存在,它的 value 是什么。我们可以使用整数、字符串、元组作为字典键,但不能使用列表作为它的键。原因解释如下。
Python字典如何搜索它们的键
如果Python字典只是遍历它们的键以检查给定的键是否存在,则需要O(N)时间。但是Python字典需要O(1)来检查密钥是否存在。因此,字典如何搜索键,对于每个键,它都会为键生成一个哈希值,并通过这个哈希值,它可以跟踪其元素。
将列表用作字典键时的问题
列表是可变对象,这意味着我们可以更改列表中的值追加或删除列表的值。因此,如果从列表生成哈希函数,然后列表中的项目发生更改,则字典将为该列表生成一个新的哈希值并且找不到它。
例如,如果列表是a = [1, 2, 3, 4, 5]
并且假设列表的哈希是列表内值的总和。所以 hash(a) = 15。现在我们将 6 附加到 a 。所以a = [1, 2, 3, 4, 5, 6]
hash(a) = 21。所以 a 的哈希值发生了变化。因此在字典中找不到。
另一个问题是具有相同哈希值的不同列表。如果b = [5, 5, 5]
hash(b) = 15。因此,如果字典中存在 a(从上面的示例中具有相同的哈希值),并且如果我们搜索 b。那么字典可能会给我们错误的结果。
如何处理这个
我们可以将列表更改为字符串或元组等不可变对象,然后可以将其用作键。下面是该方法的实现。
# Declaring a dictionary
d = {}
# This is the list which we are
# trying to use as a key to
# the dictionary
a =[1, 2, 3, 4, 5]
# converting the list a to a string
p = str(a)
d[p]= 1
# converting the list a to a tuple
q = tuple(a)
d[q]= 1
for key, value in d.items():
print(key, ':', value)
输出:
[1, 2, 3, 4, 5] : 1
(1, 2, 3, 4, 5) : 1