如何用迭代器简洁实现批量生成字典列表并覆盖指定键值?
嘿,我完全懂你想要更简洁代码的心情——重复的copy()和循环确实显得有点冗余。这里有几种更优雅的方式来实现你要的功能,而且能轻松扩展到多列表的场景:
单列表场景:一行搞定字典覆盖
你可以用字典解包或者dict()构造函数来避免显式的copy()操作,直接在列表推导式里生成新字典:
方法1:字典解包(推荐,可读性强)
d = {"a": 1, "b": 10} c = [3, 4, 5] arg = [{**d, "a": i} for i in c]
**d会把原字典的所有键值对展开,后面的"a": i会覆盖原字典中"a"的值,这样每一次迭代都会生成一个全新的字典,完全不需要手动复制。
方法2:dict()构造函数(更简洁)
arg = [dict(d, a=i) for i in c]
dict()构造函数会先接收原字典d的键值对,然后用后面的关键字参数(这里是a=i)覆盖对应键的值,效果和上面完全一致。
多列表场景:避免嵌套循环
如果有4-5个类似的列表需要覆盖不同的键,用itertools.product可以把多维度的循环扁平化,代码会清爽很多:
比如假设我们有两个列表,分别要覆盖"a"和"b":
from itertools import product d = {"a": 1, "b": 10} list_a = [3, 4, 5] list_b = [6, 7, 8] # 生成所有组合的字典列表 arg = [{**d, "a": val_a, "b": val_b} for val_a, val_b in product(list_a, list_b)]
这样生成的结果会包含list_a和list_b所有元素的组合,比嵌套多层for循环要简洁太多,而且扩展性强——再加一个列表的话,只需要在product里多传一个列表,然后在字典里多加一个键值对就行。
这两种方式都能完美替代你原来的代码,而且更符合Python的简洁风格~
内容的提问来源于stack exchange,提问作者ClimateUnboxed
相关产品推荐
相关产品推荐

