Python 为什么字典的键必须是不可变的
为了理解为什么字典键必须是不可变的,让我们将其与哈希表相关联。字典的哈希表实现使用从键值计算出的哈希值来查找键。如果键是可变对象,其值可能会发生变化,从而导致其哈希值也发生变化。
如上所述,由于不知道更改键对象的人无法得知它被用作字典键,它不能在字典中移动该条目。然后,
- 当您尝试在字典中查找相同对象时,它将无法找到,因为其哈希值不同。
-
如果尝试查找旧值,也无法找到,因为在哈希桶中找到的对象的值将不同。
如果你想要一个以列表为索引的字典,请按照以下步骤进行:
- 将列表转换为元组
- 函数tuple(myList)可以创建一个与列表myList具有相同条目的元组。
- 元组是不可变的,因此可以用作字典的键。
将列表转换为元组
示例
要将列表转换为元组,使用tuple()函数-
# Creating a List
mylist = ["Jacob", "Harry", "Mark", "Anthony"]
# Displaying the List
print("List = ",mylist)
# Convert List to Tuple
res = tuple(mylist)
print("Tuple = ",res)
输出
List = ['Jacob', 'Harry', 'Mark', 'Anthony']
Tuple = ('Jacob', 'Harry', 'Mark', 'Anthony')
元组作为键
示例
现在,我们将看一个示例,首先将列表转换为元组,然后将元组设置为键 –
# Creating a List
mylist = ["Jacob", "Harry", "Mark", "Anthony"]
# Displaying the List
print("List = ",mylist)
# Convert List to Tuple
res = tuple(mylist)
print("Tuple = ",res)
dct = {2:"num","demo":"string"}
print("Dictionary = ")
print(dct)
# Overwrite existing value with a tuple
dct[2]=res
print("\nUpdated Dictionary (Tuple as Key)...")
print(dct)
输出
('List = ', ['Jacob', 'Harry', 'Mark', 'Anthony'])
('Tuple = ', ('Jacob', 'Harry', 'Mark', 'Anthony'))
Dictionary =
{'demo': 'string', 2: 'num'}
Updated Dictionary (Tuple as Key)...
{'demo': 'string', 2: ('Jacob', 'Harry', 'Mark', 'Anthony')}