Python之字典的特性

1. Python中字典的概念与特点

Python的字典是一种可变容器模型,可存储任意类型对象。字典的每个元素都是由一个key和其对应的value组成的,可以通过key来访问对应的value。字典使用大括号{}表示,keyvalue之间用冒号:分隔,每个元素之间用逗号,分隔,示例代码如下:

dict1 = {'name': 'John', 'age': 18, 'score': [80, 90, 85]}

print(dict1['name']) # 输出 John

print(dict1['score']) # 输出 [80, 90, 85]

字典具有以下特点:

字典中的key必须是不可变类型,如字符串、数字或元组;

字典是无序的,即字典中的元素没有顺序之分,不支持索引和切片;

字典中的key必须是唯一的,如果有重复的key,后面的会覆盖前面的。

2. 字典的基本操作

2.1. 创建字典

可以使用大括号{}来创建一个空字典,也可以在大括号中提供初始的key-value对来创建一个包含多个元素的字典,示例代码如下:

dict1 = {}

dict2 = {'name': 'John', 'age': 18, 'score': [80, 90, 85]}

另外,还可以通过字典的fromkeys()方法来创建一个包含指定key的字典,每个key对应的初始value均为None,示例代码如下:

dict3 = dict.fromkeys(['name', 'age', 'score'])

print(dict3) # 输出 {'name': None, 'age': None, 'score': None}

2.2. 访问字典中的元素

可以通过key来访问字典中对应的value,如果key不存在,则会抛出KeyError异常,示例代码如下:

dict1 = {'name': 'John', 'age': 18, 'score': [80, 90, 85]}

print(dict1['name']) # 输出 John

print(dict1['gender']) # 抛出 KeyError 异常

除了使用[]来访问字典元素外,还可以使用字典的get()方法来访问元素,如果key不存在,则返回指定的默认值(默认值为None),示例代码如下:

dict1 = {'name': 'John', 'age': 18, 'score': [80, 90, 85]}

print(dict1.get('name')) # 输出 John

print(dict1.get('gender')) # 输出 None

print(dict1.get('gender', 'unknown')) # 输出 unknown

2.3. 添加和修改字典元素

可以使用[]来添加和修改字典中的元素,示例代码如下:

dict1 = {'name': 'John', 'age': 18, 'score': [80, 90, 85]}

dict1['gender'] = 'male' # 添加新元素

dict1['age'] = 19 # 修改元素

print(dict1) # 输出 {'name': 'John', 'age': 19, 'score': [80, 90, 85], 'gender': 'male'}

另外,还可以通过字典的update()方法来批量添加或修改字典的元素,示例代码如下:

dict1 = {'name': 'John', 'age': 18, 'score': [80, 90, 85]}

dict1.update({'gender': 'male', 'age': 19})

print(dict1) # 输出 {'name': 'John', 'age': 19, 'score': [80, 90, 85], 'gender': 'male'}

2.4. 删除字典元素

可以使用del语句或字典的pop()方法来删除字典中指定key的元素,示例代码如下:

dict1 = {'name': 'John', 'age': 18, 'score': [80, 90, 85]}

del dict1['age'] # 删除元素

print(dict1) # 输出 {'name': 'John', 'score': [80, 90, 85]}

value = dict1.pop('score') # 删除元素并返回对应的 value

print(dict1) # 输出 {'name': 'John'}

print(value) # 输出 [80, 90, 85]

另外,还可以通过字典的clear()方法来清空字典中所有元素,示例代码如下:

dict1 = {'name': 'John', 'age': 18, 'score': [80, 90, 85]}

dict1.clear()

print(dict1) # 输出 {}

3. 字典的常用方法

3.1. keys()方法

字典的keys()方法返回一个包含所有key的列表,示例代码如下:

dict1 = {'name': 'John', 'age': 18, 'score': [80, 90, 85]}

keys = dict1.keys()

print(keys) # 输出 dict_keys(['name', 'age', 'score'])

返回的列表可以用list()函数转换为列表,也可以直接遍历:

dict1 = {'name': 'John', 'age': 18, 'score': [80, 90, 85]}

for key in dict1.keys():

print(key, dict1[key])

3.2. values()方法

字典的values()方法返回一个包含所有value的列表,示例代码如下:

dict1 = {'name': 'John', 'age': 18, 'score': [80, 90, 85]}

values = dict1.values()

print(values) # 输出 dict_values(['John', 18, [80, 90, 85]])

返回的列表同样可以用list()函数转换为列表,也可以直接遍历:

dict1 = {'name': 'John', 'age': 18, 'score': [80, 90, 85]}

for value in dict1.values():

print(value)

3.3. items()方法

字典的items()方法返回一个包含所有key-value对的列表,每个key-value对是一个元组,示例代码如下:

dict1 = {'name': 'John', 'age': 18, 'score': [80, 90, 85]}

items = dict1.items()

print(items) # 输出 dict_items([('name', 'John'), ('age', 18), ('score', [80, 90, 85])])

返回的列表同样可以用list()函数转换为列表,也可以直接遍历:

dict1 = {'name': 'John', 'age': 18, 'score': [80, 90, 85]}

for key, value in dict1.items():

print(key, value)

3.4. copy()方法

字典的copy()方法返回一个浅拷贝的字典,示例代码如下:

dict1 = {'name': 'John', 'age': 18, 'score': [80, 90, 85]}

dict2 = dict1.copy()

print(dict2) # 输出 {'name': 'John', 'age': 18, 'score': [80, 90, 85]}

print(dict1 is dict2) # 输出 False

注意,copy()方法只会拷贝对象的引用,而不会复制对象本身,因此对于可变对象,修改一个字典中元素的值可能会影响拷贝出来的字典。

3.5. setdefault()方法

字典的setdefault()方法用于获取指定keyvalue,如果key不存在,则将其加入字典并设置对应的默认值,示例代码如下:

dict1 = {'name': 'John', 'age': 18, 'score': [80, 90, 85]}

name = dict1.setdefault('name', 'unknown')

gender = dict1.setdefault('gender', 'male')

print(name, dict1) # 输出 John {'name': 'John', 'age': 18, 'score': [80, 90, 85], 'gender': 'male'}

print(gender, dict1) # 输出 male {'name': 'John', 'age': 18, 'score': [80, 90, 85], 'gender': 'male'}

4. 字典的应用场景

字典是Python中使用频率非常高的一种数据类型,其应用场景非常广泛。

4.1. 统计词频

在自然语言处理中,常常需要统计一段文本中每个单词出现的次数,这时可以使用字典来实现。例如,下面的代码统计了一段文本中每个单词出现的次数:

text = 'This is a sample text with several words. This is another sample text with some more words.'

words = text.split() # 将文本按空格分隔成单词列表

counts = {}

for word in words:

counts[word] = counts.get(word, 0) + 1 # 统计每个单词出现的次数

print(counts)

输出结果如下:

{'This': 2, 'is': 2, 'a': 1, 'sample': 2, 'text': 2, 'with': 2, 'several': 1, 'words.': 1, 'another': 1, 'some': 1, 'more': 1}

4.2. 处理配置文件

配置文件通常以键值对的形式保存,可以使用字典来存储和读取配置文件中的键值对。

例如,下面的代码读取了一个名为config.json的JSON文件,将其中的键值对读入字典config中:

import json

with open('config.json', 'r') as f:

config = json.load(f)

print(config)

4.3. 缓存数据

在一些计算任务中,为了加速计算过程,常常需要将中间结果保存下来,以便于后续计算时直接读取,避免重复计算。这时可以使用字典来实现中间数据的缓存:

def expensive_func(param):

"""一个复杂的计算函数"""

# ...

return result

cache = {}

def cached_func(param):

"""一个带缓存的计算函数"""

if param not in cache:

cache[param] = expensive_func(param)

return cache[param]

在这段代码中,在每次调用cached_func()时,先检查缓存中是否已经有了计算结果,有则直接返回,没有则调用expensive_func()进行计算,并将结果存入缓存。

5. 总结

字典是一种非常常用的数据类型,它能够快速地查找指定key对应的value,并且支持动态添加、删除和修改元素。另外,字典的应用场景非常广泛,例如统计词频、处理配置文件和缓存数据等。因此,掌握字典的使用方法是Python编程的重要基础。

后端开发标签