如何向Python字典中添加新键
技术背景
在Python编程中,字典(dictionary)是一种非常重要的数据结构,它以键值对(key-value pairs)的形式存储数据。在实际开发中,我们经常需要向已有的字典中添加新的键值对。本文将详细介绍在Python中向字典添加新键的各种方法。
实现步骤
1. 创建字典
在添加新键之前,我们需要先创建一个字典。可以创建空字典,也可以创建带有初始值的字典。
1 2 3 4 5 6 7 8
| data1 = {} data2 = dict()
data3 = {'a': 1, 'b': 2, 'c': 3} data4 = dict(a=1, b=2, c=3) data5 = {k: v for k, v in (('a', 1), ('b', 2), ('c', 3))}
|
2. 插入/更新单个值
可以使用多种方式向字典中插入或更新单个值。
1 2 3 4 5 6 7 8 9
| data = {'key': 'value'}
data['mynewkey'] = 'mynewvalue'
data.update({'mynewkey': 'mynewvalue'}) data.update(dict(mynewkey='mynewvalue')) data.update(mynewkey='mynewvalue')
|
3. 插入/更新多个值
如果需要同时插入或更新多个值,可以使用 update
方法,在Python 3.9+ 中还可以使用 |=
操作符。
1 2 3 4 5 6 7 8
| data = {'key': 'value'} d = {'c': 3, 'd': 4}
data.update(d)
data |= d
|
4. 创建合并字典而不修改原始字典
在Python 3.5+ 中可以使用字典解包,Python 3.9+ 还可以使用 |
操作符。
1 2 3 4 5 6 7
| data1 = {'a': 1, 'b': 2} data2 = {'c': 3, 'd': 4} data3 = {**data1, **data2}
data = data1 | data2
|
5. 删除字典中的项
可以使用 del
、pop
和 clear
方法删除字典中的项。
1 2 3 4 5 6 7 8 9 10
| data = {'key': 'value', 'mynewkey': 'mynewvalue'}
del data['key']
value = data.pop('mynewkey')
data.clear()
|
6. 检查键是否存在
可以使用 in
操作符检查键是否已经存在于字典中。
1 2 3
| data = {'key': 'value'} if 'key' in data: print('键存在')
|
7. 遍历字典
可以使用不同的方法遍历字典中的键、值或键值对。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| data = {'a': 1, 'b': 2, 'c': 3}
for key in data: print(key)
for key, value in data.items(): print(key, value)
for key in data.keys(): print(key)
for value in data.values(): print(value)
|
8. 从两个列表创建字典
可以使用 zip
函数将两个列表转换为字典。
1 2 3
| list_with_keys = ['a', 'b', 'c'] list_with_values = [1, 2, 3] data = dict(zip(list_with_keys, list_with_values))
|
核心代码
以下是一些向字典添加新键的核心代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| d = {'key': 'value'} d['mynewkey'] = 'mynewvalue'
x = {1: 2} d = {3: 4, 5: 6, 7: 8} x.update(d)
data = {'a': 1} data |= {'b': 2, 'c': 3}
data1 = {'a': 1, 'b': 2} data2 = {'c': 3, 'd': 4} data3 = {**data1, **data2}
data = data1 | data2
|
最佳实践
1. 单个键值对添加
使用下标表示法(subscript notation)添加单个键值对,这种方法简单直接,且计算开销较小。
1 2
| my_dict = {} my_dict['new key'] = 'new value'
|
2. 多个键值对添加
使用 update
方法添加多个键值对,如果键名是合法的Python单词,也可以使用关键字参数的方式,这样代码更易读。
1 2 3
| my_dict = {'new key': 'new value'} my_dict.update({'key 2': 'value 2', 'key 3': 'value 3'}) my_dict.update(foo='bar', foo2='baz')
|
3. 避免使用 __setitem__
方法
虽然 __setitem__
方法可以用于添加键值对,但它的性能不如下标表示法,应尽量避免使用。
1 2 3 4 5 6 7
| d = {} d.__setitem__('foo', 'bar')
d = {} d['foo'] = 'bar'
|
4. 使用 collections.defaultdict
如果处理的字典总是包含相同的数据类型或结构,可以使用 collections.defaultdict
,它可以简化新键的添加和赋值操作。
1 2 3
| from collections import defaultdict example = defaultdict(int) example['key'] += 1
|
常见问题
1. 键已经存在的情况
如果键已经存在,使用直接赋值或 update
方法会覆盖原有的值。如果不想覆盖,可以使用 setdefault
方法。
1 2 3
| mydict = {'a': 1, 'b': 2, 'c': 3} mydict.setdefault('d', 4) mydict.setdefault('a', 111)
|
2. 向嵌套字典中添加键
如果需要向嵌套字典中添加键,可以使用 setdefault
方法先初始化嵌套字典。
1 2
| mydict = {'id': {'id_num': 'xxxx', 'url': 'www.example.com'}} mydict.setdefault('address', {})['work'] = '123 A St'
|
3. 性能问题
对于少量键值对的添加,使用下标表示法性能较好;对于大量键值对的添加,使用 update
方法或 |=
操作符性能更好。
1 2 3 4 5 6 7 8 9 10 11
| import timeit
t1 = timeit.timeit('dictionary = {"karga": 1, "darga": 2}; dictionary["aaa"] = 123123; dictionary["asd"] = 233;') t2 = timeit.timeit('dictionary = {"karga": 1, "darga": 2}; dictionary.update({"aaa": 123123, "asd": 233})')
setup = "pairs = list(zip(range(5), range(5)))" t3 = min(timeit.repeat("d={};d.update(pairs)", setup)) t4 = min(timeit.repeat("d={};for k,v in pairs: d[k] = v", setup)) t5 = min(timeit.repeat("d={};d |= pairs", setup))
|