Python字典中的键可以是列表

Python字典中的键可以是列表

Python中的字典(Dictionary)是一种无序、可变的数据类型,它以键值对(Key-Value)的形式存储数据。在Python的字典中,键必须是不可变的数据类型,如数字、字符串和元组等等,而值可以是任何Python数据类型。

然而,在Python中,列表(List)是一种可变的数据类型,它的元素是可以被修改的。那么,是否有可能在Python的字典中使用列表作为键呢?答案是肯定的,Python允许使用列表作为字典的键。

如何在Python字典中使用列表作为键

要在Python的字典中使用列表作为键,只需将列表作为字典键传递给对应的值即可。例如:

my_dict = {['apple', 'orange']: 2, ['banana']: 3}
print(my_dict)

运行代码会报错:

Traceback (most recent call last):
  File "test.py", line 1, in <module>
    my_dict = {['apple', 'orange']: 2, ['banana']: 3}
TypeError: unhashable type: 'list'

因为Python中的列表是可变的,它们不能被哈希(Hash)化,因此不能作为字典的键。哈希化是指将变量转换成一个唯一的固定长度的值,用于比较和查找。因为哈希化的值是唯一的,所以使用哈希值作为键可以更快地查找和比较。

但是,如果将列表转换成元组(Tuple),它就可以被哈希化并作为字典的键。例如:

my_dict = {('apple', 'orange'): 2, ('banana',): 3}
print(my_dict)

输出结果为:

{('apple', 'orange'): 2, ('banana',): 3}

同时,我们也可以使用元组、数字、布尔值等其他不可变数据类型作为字典的键。

my_dict = {(1, 2): 2, True: 'Hello', 3.14: [1, 2, 3]}
print(my_dict)

输出结果为:

{(1, 2): 2, True: 'Hello', 3.14: [1, 2, 3]}

字典中键的唯一性

在Python的字典中,每个键都是唯一的,如果有重复的键,则会覆盖原有的键值对。例如:

my_dict = {'name': 'John', 'age': 28, 'name': 'Mike'}
print(my_dict)

输出结果为:

{'name': 'Mike', 'age': 28}

因为键值对是无序的,所以当存在重复的键时,后一个键值对会覆盖前一个键值对。这点需要注意。

字典中键的可变性

我们已经知道,Python的字典键必须是不可变数据类型,因此,我们不能在字典中使用列表或其他可变数据类型作为键。虽然转换成元组后可以使用作为键,但是需要注意的是,如果元组中的元素是可变的,那么虽然元组可以哈希,但当元组中有可变元素发生修改时,元组的哈希值将改变,进而导致字典中对应的键无法查找。例如:

my_dict = {('apple', 'orange'): 2, ('banana', [1, 2]): 3}
print(my_dict)

输出结果为:

{('apple', 'orange'): 2, ('banana', [1, 2]): 3}

可以看到,这样的字典存储成功了,但是我们无法修改对应键的值:

my_dict[('banana', [1, 2])] = 4      # 修改键的值
print(my_dict)

运行上述代码,会得到如下错误:

TypeError: unhashable type: 'list'

因为元组的哈希值是由元组中的元素决定的,而列表是可变的,它的哈希值可能会发生变化,因此不能作为元组的元素,所以字典中对应的键无法查找。

字典的常用操作

除了使用列表或其他可变数据类型作为键,Python的字典还提供了一些常用的操作。下面我们会简单介绍几个常用的操作。

1. 新增键值对

我们可以使用字典的dict[key] = value语句添加新的键值对。例如,下面的代码为一个字典添加了两个键值对:

my_dict = {'name': 'John', 'age': 28}
my_dict['gender'] = 'male'
my_dict['location'] = 'New York'
print(my_dict)

输出结果为:

{'name': 'John', 'age': 28, 'gender': 'male', 'location': 'New York'}

2. 获取键对应的值

我们可以使用字典的dict[key]语句获取指定键对应的值。例如:

my_dict = {'name': 'John', 'age': 28}
name = my_dict['name']
print(name)

输出结果为:

John

如果键不存在,会报KeyError错误。为了避免此类错误,可以使用dict.get(key, default)方法获取某个键对应的值,如果该键不存在,则返回指定的默认值。例如:

my_dict = {'name': 'John', 'age': 28}
gender = my_dict.get('gender', 'unknown')
print(gender)

输出结果为:

unknown

3. 删除键值对

我们可以使用del dict[key]语句删除指定键值对。例如:

my_dict = {'name': 'John', 'age': 28}
del my_dict['age']
print(my_dict)

输出结果为:

{'name': 'John'}

如果指定的键不存在,会报KeyError错误。为了避免此类错误,可以使用dict.pop(key, default)方法删除指定键对应的键值对,并返回该键对应的值。如果指定的键不存在,则返回指定的默认值。例如:

my_dict = {'name': 'John', 'age': 28}
age = my_dict.pop('age', 'unknown')
print(age)
print(my_dict)

输出结果为:

28
{'name': 'John'}

4. 遍历字典

我们可以使用for key in dict语句遍历字典中的所有键。例如:

my_dict = {'name': 'John', 'age': 28}
for key in my_dict:
    print(key)

输出结果为:

name
age

如果我们需要遍历字典中的所有值,可以使用for value in dict.values()语句。例如:

my_dict = {'name': 'John', 'age': 28}
for value in my_dict.values():
    print(value)

输出结果为:

John
28

如果我们需要同时遍历字典中的键和值,可以使用for key, value in dict.items()语句。例如:

my_dict = {'name': 'John', 'age': 28}
for key, value in my_dict.items():
    print(key, value)

输出结果为:

name John
age 28

结论

在Python的字典中,键必须是不可变的数据类型,如数字、字符串和元组等等,但是可以使用元组作为键,而元组中的元素可以是任何Python数据类型,只要它们不是可变的即可。尽管可以使用列表作为字典的值,但是不能使用列表作为字典的键,因为Python中的列表是可变的,不能被哈希。

当使用列表或其他可变数据类型作为元组的元素时,需要注意元素的可变性,因为可变元素的改变会导致元组的哈希值改变,进而导致字典中对应的键无法被查找。

此外,Python的字典还提供了常用的操作,如新增键值对、获取键对应的值、删除键值对和遍历字典等等。熟练掌握这些操作可以让我们处理字典类型的数据更加得心应手。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程