详解Python 字典默认值

  • Post category:Python

当我们使用Python的字典时,有时候需要在获取某个键的值时,如果该键不存在,不希望程序报错而是要指定一个默认值,这时我们就需要用到Python字典的默认值。本篇攻略将详细介绍Python字典默认值的使用方法,包括以下几个方面:

  1. 为什么需要字典默认值
  2. 如何使用字典默认值
  3. 字典默认值的常见误区及应对方法
  4. 示例说明与练习

为什么需要字典默认值

在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()方法、找不到默认值等等。这时我们需要注意以下的几点:

  1. 当使用字典的get()方法时,如果不指定默认值,则会返回None。如果后续代码在这个结果上进行操作,可能会出现异常,因为None不支持所有类型的操作,所以建议当键不存在时,尽量使用setdefault()等默认值函数。

  2. 设置默认值时,应该考虑字典中的键数据类型和默认值类型。如果键存储的是字符串类型,而默认值是整型,可能会导致后续代码出现数据类型异常。

  3. 所有默认值的类型应该与字典值项的类型是一致的。

示例说明与练习

下面给出两个示例说明,帮助大家更好地理解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}}

上面的代码中,我们首先将数据解析成一个字典,然后再计算每个商品的总价,最后输出字典。