当我们使用Python的字典时,有时候需要在获取某个键的值时,如果该键不存在,不希望程序报错而是要指定一个默认值,这时我们就需要用到Python字典的默认值。本篇攻略将详细介绍Python字典默认值的使用方法,包括以下几个方面:
- 为什么需要字典默认值
- 如何使用字典默认值
- 字典默认值的常见误区及应对方法
- 示例说明与练习
为什么需要字典默认值
在Python中,我们通常使用字典(dictionary)存储键值对数据,当我们需要在字典中查找某个键对应的值时,一般都是使用字典的get()方法,如下所示:
user = {'name': 'Mike', 'age': 22, 'gender': 'male'}
name = user.get('name') # 查找键name对应的值
print(name) # 输出结果:Mike
不过,如果我们想要查找的键不存在,这时就会报KeyError的错误,如下所示:
height = user.get('height') # 查找键height对应的值
print(height) # 输出结果:None
而有时候,我们希望键不存在时,不是返回None值,而是返回一个默认值,以便保证程序不会因为键值不存在而出错。这时,就需要用到Python字典的默认值。
如何使用字典默认值
在Python字典中设置默认值,可以使用字典的setdefault()方法。setdefault()方法接受两个参数,第一个参数是需要查找的键,第二个参数是可选的默认值,如果该键不存在,则会将键和默认值添加到字典中。如果该键已存在,则setdefault()方法不会修改原有的键值。
user = {'name': 'Mike', 'age': 22, 'gender': 'male'}
height = user.setdefault('height', 175) # 设置默认值为175
print(height) # 输出结果:175
weight = user.setdefault('weight', 70) # 设置默认值为70
print(weight) # 输出结果:70
print(user) # 输出结果:{'name': 'Mike', 'age': 22, 'gender': 'male', 'height': 175, 'weight': 70}
另外,Python中还有一个collections模块中的defaultdict类,可以在创建字典时指定默认值。
from collections import defaultdict
user = defaultdict(lambda: 'Unknown') # 值默认为'Unknown'
user['name'] = 'Mike'
user['age'] = 22
print(user['name']) # 输出结果:Mike
print(user['gender']) # 输出结果:Unknown
上面的代码中,我们使用lambda表达式来指定默认值为’Unknown’,当我们使用user字典对象查找一个不存在的键值对时,会返回默认值’Unknown’。
字典默认值的常见误区及应对方法
在使用字典默认值时,可能会出现一些常见误区,比如误用字典的get()方法、找不到默认值等等。这时我们需要注意以下的几点:
-
当使用字典的get()方法时,如果不指定默认值,则会返回None。如果后续代码在这个结果上进行操作,可能会出现异常,因为None不支持所有类型的操作,所以建议当键不存在时,尽量使用setdefault()等默认值函数。
-
设置默认值时,应该考虑字典中的键数据类型和默认值类型。如果键存储的是字符串类型,而默认值是整型,可能会导致后续代码出现数据类型异常。
-
所有默认值的类型应该与字典值项的类型是一致的。
示例说明与练习
下面给出两个示例说明,帮助大家更好地理解Python字典默认值的使用方法。
示例一:
假设我们有一个名字列表,其中的名字是以姓和名中间有一个空格分开的。现在我们要将这些名字转换成一个字典,其中键为姓,值为所有该姓的名字列表。
names = ['Michael Jordan', 'Kobe Bryant', 'Stephen Curry', 'Klay Thompson', 'Kevin Durant', 'LeBron James']
# 方法一:使用if语句添加名字
d = {}
for name in names:
surname = name.split()[0]
if surname in d:
d[surname].append(name)
else:
d[surname] = [name]
# 方法二:使用setdefault设置默认值添加名字
d = {}
for name in names:
surname = name.split()[0]
d.setdefault(surname, []).append(name)
print(d)
输出结果:
{'Michael': ['Michael Jordan'], 'Kobe': ['Kobe Bryant'], 'Stephen': ['Stephen Curry'], 'Klay': ['Klay Thompson'], 'Kevin': ['Kevin Durant'], 'LeBron': ['LeBron James']}
示例二:
假设我们有一个文件,文件中包含了很多商品的名称、价格、数量等信息。我们需要将这些信息转换成一个字典,并计算每个商品的总价。
data = '''
iPhone, 8999, 100
MacBook, 11999, 50
iPad, 3999, 200
AirPods, 1299, 500
'''
# 将数据解析成字典
d = {}
for line in data.split('\n'):
if line.strip() == '':
continue
name, price, quantity = line.split(',')
d[name.strip()] = {'price': float(price), 'quantity': int(quantity)}
# 计算每个商品的总价
for name in d:
d[name]['total'] = d[name]['price'] * d[name]['quantity']
print(d)
输出结果:
{'iPhone': {'price': 8999.0, 'quantity': 100, 'total': 899900.0}, 'MacBook': {'price': 11999.0, 'quantity': 50, 'total': 599950.0}, 'iPad': {'price': 3999.0, 'quantity': 200, 'total': 799800.0}, 'AirPods': {'price': 1299.0, 'quantity': 500, 'total': 649500.0}}
上面的代码中,我们首先将数据解析成一个字典,然后再计算每个商品的总价,最后输出字典。