📜  如何在Python 3 中使用列表作为字典的键?

📅  最后修改于: 2022-05-13 01:55:39.063000             🧑  作者: Mango

如何在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