机器学习初学者 04月08日 13:11
【Python】100个字典编程小技巧,让你成为Python高手
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文深入探讨了Python字典的强大功能,提供了100个实用技巧,涵盖了字典的创建、更新、合并、迭代、排序、转换以及与其他数据结构的交互等多个方面。通过这些技巧,读者可以更高效地利用字典解决实际编程问题,提升代码的简洁性和性能。

🔑字典是Python中一种重要的数据结构,它以键值对的形式存储数据,具有无序、可变、动态的特性,键必须是不可变的且唯一。

💡利用字典推导式、dict.update()、**解包等方法,可以灵活地创建、更新和合并字典,提高代码的简洁性,例如使用update()方法合并字典时,如果遇到相同的键,新值会覆盖旧值。

🔄通过keys()、values()、items()等方法,可以方便地迭代字典的键、值和键值对。结合sorted()函数,可以对字典进行排序,或者使用collections.OrderedDict保持键的插入顺序。

⚙️文章还介绍了使用defaultdict、setdefault、get等方法处理缺失键,以及与JSON、集合、元组等数据结构的转换,甚至包括使用Counter进行计数,以及使用MappingProxyType创建不可变字典等高级技巧。

学研君 2025-04-08 12:04 浙江

Python 字典使用秘籍:100 个技巧带你玩转键值对。

Python 字典使用秘籍:100 个技巧带你玩转键值对。


在Python编程的世界里,字典作为一种极为重要的内置数据类型,承载着无序键值对集合的功能,在其他编程语言中,它还有关联数组、哈希映射等别称。通过简洁的花括号{}以及冒号:,我们就能定义字典。

以如下代码为例,

my_dict = {'key1''value1''key2''value2''key3''value3'}

其中'key1''key2''key3'是键,'value1''value2''value3'是对应的值。

Python中字典具备无序性(自Python 3.7起保持插入顺序)、可变性、动态性等特性,键类型灵活但必须不可变,且键唯一。

掌握字典的使用技巧,有利于提升Python编程效率,接下来分享100个高效使用Python字典的技巧:

1.使用字典推导式:使用简洁易读的字典推导式创建字典。
my_dict = {key: value for key, value in iterable}
2.使用dict.update()更新值:根据条件更新字典中的值。
my_dict.update((k, v * 2for k, v in my_dict.items() if condition)
3.合并包含相同键的字典:使用 update 方法合并字典,用新值更新已有的键。
dict1.update(dict2)
4.更新多个键:使用包含键值对的字典通过 update 一次性更新多个键。
update_dict = {'key1''new_value1''key2''new_value2'}
my_dict.update(update_dict)
5.根据另一个字典更新值:根据 dict2 中的对应值更新 dict1 中的值。
dict1.update((k, dict1[k] + dict2[k]) for k in dict1.keys() & dict2.keys())
6.字典解包:使用字典解包从键值对创建字典。
keys = ['a''b''c']
values = [123]
my_dict = dict(zip(keys, values))
7.字典键解包:在函数调用中使用字典解包,将键值对作为关键字参数传递。
my_function(**my_dict)
8.使用**解包合并字典:使用 ** 解包操作符合并字典。
merged_dict = {**dict1, **dict2}
9.合并字典:使用 update 方法或 ** 解包操作符合并字典。
dict1 = {'a'1'b'2}
dict2 = {'b'3'c'4}
dict1.update(dict2)
# 或者
merged_dict = {**dict1, **dict2}
10.使用defaultdict设置默认值:从 collections 模块中使用 defaultdict 来设置默认值。
from collections import defaultdict
my_dict = defaultdict(int)
11.使用defaultdict处理缺失键:使用带有自定义工厂函数的 defaultdict 优雅地处理缺失键。
from collections import defaultdict
my_dict = defaultdict(lambda"default_value")
12.使用collections.defaultdict设置默认值:使用带有默认工厂函数的 defaultdict 简化对值进行递增的代码。
from collections import defaultdict
my_dict = defaultdict(int)
my_dict['key'] += 1
13.使用setdefault设置默认值:使用 setdefault 在键存在时获取值,不存在时设置默认值。
my_dict.setdefault(key, default_value)
14.使用get避免键错误:使用 get 来获取值,如果键不存在则返回默认值。
value = my_dict.get(key, default_value)
15.高效迭代:使用 items() 高效地迭代键值对。
for key, value in my_dict.items():
    print(key, value)
16.键和值视图:利用 keys() 和 values() 获取动态视图对象。
key_view = my_dict.keys()
value_view = my_dict.values()
17.高效删除:使用 del 高效地删除键。
del my_dict[key]
18.保留插入顺序:字典会保留插入顺序。在顺序很重要的情况下利用这个特性。
my_dict = {'a'1'b'2'c'3}
19.使用浅拷贝优化内存:使用浅拷贝实现内存高效的复制。
new_dict = my_dict.copy()
20.与JSON相互转换:使用 json.dumps 和 json.loads 方便地在字典和JSON字符串之间进行转换。
import json
json_string = json.dumps(my_dict)
new_dict = json.loads(json_string)
21.按键排序:使用 sorted 函数按排序后的顺序迭代键。
for key in sorted(my_dict):
    print(key, my_dict[key])
22.合并字典:使用 | 操作符合并字典。
merged_dict = dict1 | dict2
23.使用dict.fromkeys进行键转换:使用 dict.fromkeys 创建带有默认值的字典。
default_dict = dict.fromkeys(my_keys, default_value)
24.使用字典去重列表元素并保持顺序:使用字典从列表中删除重复元素并保持顺序。
unique_list = list(dict.fromkeys(my_list))
25.使用集合去重字典值:使用集合删除字典中的重复值。
unique_dict = {k: v for k, v in my_dict.items() if v not in set(unique_dict.values())}
26.使用itertools.groupby去重字典中的连续重复元素:使用 itertools.groupby 删除字典中连续的重复元素。
unique_dict = {k: next(g) for k, g in groupby(sorted(my_dict.items()))}
27.使用Counter计数:利用 collections 模块中的 Counter 类统计元素出现的次数。
from collections import Counter
element_counts = Counter(my_list)
28.使用types.MappingProxyType创建不可变字典:使用 types.MappingProxyType 创建字典的不可变版本。
from types import MappingProxyType
immutable_dict = MappingProxyType(my_dict)
29.提取键、值和项:将键、值和项分别提取为单独的列表。
keys = list(my_dict.keys())
values = list(my_dict.values())
items = list(my_dict.items())
30.反转字典:交换键和值创建反转字典。
inverted_dict = {v: k for k, v in my_dict.items()}
31.使用ChainMap合并字典:使用 ChainMap 逻辑上合并多个字典。
from collections import ChainMap
combined_dict = dict(ChainMap(dict1, dict2))
32.估计字典大小:估计字典占用的字节数。
import sys
size_in_bytes = sys.getsizeof(my_dict)
33.字典比较:比较两个字典是否相等。
are_equal = dict1 == dict2
34.删除键并获取值:使用 pop 删除键并获取其对应的值。
value = my_dict.pop(key, default_value)
35.使用popitem后进先出删除:使用 popitem() 高效地删除并获取最后一个键值对。
last_item = my_dict.popitem()
36.高效删除键(不抛出异常):使用带有默认值的 pop 在键不存在时删除键且不抛出异常。
deleted_value = my_dict.pop(key, None)
37.字典交集:使用 & 操作符或 dict.items() 的交集方法查找共同的键值对。
common_items = dict1.items() & dict2.items()
38.高效检查键是否存在:使用 in 检查键是否存在而不抛出异常。
key_exists = key in my_dict
39.对所有值应用函数:使用 map 或字典推导式对所有值应用函数。
modified_dict = {k: my_function(v) for k, v in my_dict.items()}
40.__missing__方法(Python 3.3+):在自定义字典类中定义 __missing__ 方法,以控制在找不到键时的行为。
class CustomDict(dict):
    def __missing__(self, key):
        return "default_value"
41.使用dict()合并字典:通过将字典转换为键值对列表来合并字典。
combined_dict = dict(list(dict1.items()) + list(dict2.items()))
42.使用copy模块进行深拷贝:使用 copy.deepcopy 创建嵌套字典的深拷贝。
import copy
deep_copy = copy.deepcopy(my_dict)
43.内存高效初始化:使用 zip 初始化字典以提高内存效率。
keys = ['a''b''c']
values = [123]
my_dict = dict(zip(keys, values))
44.将字典键转换为字符串:将字典中的所有键转换为字符串。
str_dict = {str(key): value for key, value in my_dict.items()}
45.字典异或(Exclusive Or):使用集合操作查找每个字典独有的键值对。
exclusive_items = dict1.items() ^ dict2.items()
46.内存高效迭代:迭代键、值或项时不创建不必要的列表。
for key in my_dict.keys():
    # ...
for value in my_dict.values():
    # ...
for key, value in my_dict.items():
    # ...
47.使用filter过滤字典:使用 filter 创建只包含某些键值对的字典。
filtered_dict = dict(filter(lambda item: condition(item), my_dict.items()))
48.使用字典推导式进行过滤:使用字典推导式进行简洁的过滤。
filtered_dict = {key: value for key, value in my_dict.items() if condition}
49.使用map进行过滤和映射:对字典使用 filter 和 map 函数进行高效的过滤和映射。
mapped_dict = dict(map(lambda item: (key_transform(item[0]), value_transform(item[1])), my_dict.items()))
50.使用filter高效求字典交集:使用 filter 高效查找字典的交集。
common_items = dict(filter(lambda item: item in dict2.items(), dict1.items()))
51.使用collections.OrderedDict有序字典:使用 OrderedDict 保持键插入的顺序。
from collections import OrderedDict
ordered_dict = OrderedDict([('a'1), ('b'2), ('c'3)])
52.将字典转换为元组列表:将字典转换为键值对元组的列表。
tuple_list = list(my_dict.items())
53.使用map转换键:使用 map 在保持值不变的情况下转换键。
transformed_dict = dict(map(lambda k: (transform_key(k), my_dict[k]), my_dict.keys()))
54.从元组列表创建字典:从元组列表创建字典。
tuple_list = [('a'1), ('b'2), ('c'3)]
my_dict = dict(tuple_list)
55.字典拼接:使用 + 操作符合并字典(注:实际Python中字典不能直接用+拼接,这里原文表述有误)。
concatenated_dict = dict1 + dict2
56.原地转换值:使用 map 原地转换值。
my_dict.update((k, my_transform_function(v)) for k, v in my_dict.items())
57.使用itertools.groupby分组:使用 itertools.groupby 按特定键对字典进行分组。
from itertools import groupby
grouped_dict = {k: list(v) for k, v in groupby(sorted(my_dict.items(), key=lambda x: x[0]), key=lambda x: x[0])}
58.键不区分大小写:使字典的键不区分大小写。
case_insensitive_dict = {key.lower(): value for key, value in my_dict.items()}
59.使用get和默认值安全访问嵌套字典:使用带有默认值的 get 安全访问嵌套字典的值。
nested_value = my_dict.get('key1', {}).get('key2', default_value)
60.原地排序字典:按键或值对字典进行原地排序(注:字典本身没有sort方法,需转换为列表等可排序对象后操作,这里原文表述有误)。
my_dict.sort()  # 按键排序
my_dict.sort(key=lambda x: x[1])  # 按值排序
61.**高效的tryexcept**:使用 try 和 except 高效检查键是否存在。
try:
    value = my_dict[key]
except KeyError:
    value = default_value
62.使用自定义可哈希对象作为键:通过实现 __hash__ 和 __eq__ 方法,使用自定义对象作为字典的键。
class CustomKey:
    def __init__(self, key_data):
        self.key_data = key_data

    def __hash__(self):
        return hash(self.key_data)

    def __eq__(self, other):
        return isinstance(other, CustomKey) and self.key_data == other.key_data

my_dict = {CustomKey('a'): 1, CustomKey('b'): 2}
63.使用collections.Counter计数:使用 Counter 高效统计列表或可迭代对象中元素的出现次数。
from collections import Counter
element_counts = Counter(my_list)
64.使用map转换值:使用 map 对字典中的所有值应用函数。
transformed_dict = {k: my_function(v) for k, v in my_dict.items()}
65.使用itertools.islice进行批量处理:使用 itertools.islice 对大型字典进行批量处理。
from itertools import islice
batch_size = 10
for batch in iter(lambda: list(islice(my_dict.items(), batch_size)), []):
    # 处理批次
66.反向迭代:使用 reversed 反向迭代键或项。
for key in reversed(my_dict):
    # ...
67.高效求字典交集:使用 & 操作符高效求字典的交集。
common_dict = dict1 & dict2
68.提取唯一值:使用集合从字典值中提取唯一值。
unique_values = set(my_dict.values())
69.将字典转换为具名元组:将字典转换为具名元组以便通过名称访问。
from collections import namedtuple
MyNamedTuple = namedtuple('MyNamedTuple', my_dict.keys())
my_namedtuple = MyNamedTuple(**my_dict)
70.字典减法:使用 - 操作符或 difference 方法查找第一个字典独有的元素。
unique_items = dict1.items() - dict2.items()
71.高效交换键值:高效地交换字典中的键和值。
swapped_dict = {v: k for k, v in my_dict.items()}
72.使用all判断字典是否相等: 使用all函数检查所有键值对是否匹配。
are_equal = all(dict1[key] == dict2[key] for key in dict1.keys() & dict2.keys())
73.字典子集提取: 根据一个键列表创建字典的子集。
subset_dict = {k: my_dict[k] for k in desired_keys if k in my_dict}
74.安全访问嵌套字典: 安全地访问嵌套字典,而不引发异常。
nested_value = my_dict.get('key1', {}).get('key2', {}).get('key3', default_value)
75.自定义排序: 根据自定义标准对字典进行排序。
sorted_dict = dict(sorted(my_dict.items(), key=lambda x: custom_sort_function(x[0])))
76.将列表合并为字典: 将两个列表合并成一个字典。
keys = ['a''b''c']
values = [123]
my_dict = dict(zip(keys, values))
77.将字典转换为数据框: 使用pandas库将字典转换为数据框。
import pandas as pd

df = pd.DataFrame(list(my_dict.items()), columns=['key''value'])
78.将嵌套字典转换为扁平字典: 把嵌套字典展平为一个扁平字典。
flat_dict = {k + '_' + k2: v2 for k, nested_dict in my_dict.items() for k2, v2 in nested_dict.items()}
79.使用itertools.groupby进行批量处理: 使用itertools.groupby对已排序的字典进行批量处理。
from itertools import groupby

for key, group in groupby(sorted(my_dict.items(), key=lambda x: x[0]), key=lambda x: x[0]):
    # 处理分组
80.对字典的键或值进行操作: 直接对字典的键或值进行操作。
key_intersection = my_dict.keys() & other_dict.keys()
value_difference = my_dict.values() - other_dict.values()
81.高效的值检查: 使用any函数高效检查是否有任何值满足特定条件。
has_condition_met = any(value > 10 for value in my_dict.values())
82.交替访问字典的键和值: 使用itertools.cycle交替访问字典的键和值。
from itertools import cycle

alternating_items = {k: v for k, v in zip(my_dict.keys(), cycle(my_dict.values()))}
83.高效初始化defaultdict: 使用带有工厂函数的defaultdict高效初始化嵌套字典。
from collections import defaultdict

nested_dict = defaultdict(dict)
84.内存高效的键存在性检查: 使用集合进行内存高效的键存在性检查。
key_exists = key in set(my_dict)
85.使用collections.ChainMap合并字典: 使用collections.ChainMap合并字典,而不创建新字典。
from collections import ChainMap

combined_dict = dict(ChainMap(dict1, dict2))
86.简化字典反转: 使用字典推导式反转字典。
inverted_dict = {v: k for k, v in my_dict.items()}
87.使用iteritems进行内存高效的迭代: 使用iteritems进行内存高效的迭代,特别是对于大型字典。
for key, value in my_dict.iteritems():
    # ...
88.将键转换为集合: 将字典的键转换为集合,以便进行高效的集合操作。
key_set = set(my_dict.keys())
89.将字典转换为不可变集合的集合: 将字典转换为不可变集合的集合,以便进行集合操作。
set_of_frozensets = {frozenset(item) for item in my_dict.items()}
90.高效转换为布尔值: 利用字典的真值性进行高效检查。
if my_dict:
    # 字典不为空
91.清空字典: 清空字典中的所有项。
my_dict.clear()
92.使用set.symmetric_difference求字典的对称差: 使用集合操作找出两个字典的对称差。
symmetric_difference = set(my_dict1.items()).symmetric_difference(my_dict2.items())
93.根据键提取子字典: 根据一个键列表创建子字典。
keys_to_extract = ['key1''key2']
sub_dict = {k: my_dict[k] for k in keys_to_extract if k in my_dict}
94.使用next并设置默认值: 使用next函数并设置默认值,以获取下一个值;若迭代器耗尽,则返回默认值。
next_value = next(iter(my_dict.values()), default_value)
95.单行检查字典中键是否存在: 使用单行代码检查字典中是否存在某个键。
key_exists = my_dict.get(key) is not None
96.为字典的所有键添加前缀: 为字典中的所有键添加前缀。
prefix = 'prefix_'
prefixed_dict = {prefix + k: v for k, v in my_dict.items()}
97.使用正则表达式过滤键和值: 使用正则表达式过滤键和值。
import re

filtered_dict = {k: v for k, v in my_dict.items() if re.match(pattern, k)}
98.字典异或操作: 对两个字典执行异或操作,以获取唯一项。
exclusive_items = dict1.items() ^ dict2.items()
99.字典视图交集: 使用字典视图的交集来获取共同项。
common_items = my_dict.viewitems() & other_dict.viewitems()
100.字典列表中按键求最大值: 在字典列表中按键找出最大值。
max_values = {k: max(d[k] for d in list_of_dicts) for k in set.union(*(d.keys() for d in list_of_dicts))}

需要说明的是,上述代码中的viewitems()在 Python 3 里已被items()替代,iteritems()在 Python 3 中也不存在了,可直接用items()进行迭代。

希望本文介绍的 100 个技巧能成为你 Python 编程路上的得力助手,帮助你更高效地处理数据,编写出更简洁、健壮的代码。记得在实际编程中多多练习、灵活运用,不断探索 Python 字典的更多可能。



阅读原文

跳转微信打开

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

Python 字典 键值对 编程技巧
相关文章