Python如何将字典复制指定次数 与原列表打包生成元组列表
问题场景
现有如下定义的列表与字典:
l: list = [1,2,3,4] d: dict = {"Hello": "World"}
需要将字典精确复制len(l)次,最终生成格式如下的元组列表:
[(1, {"Hello": "World"}),(2, {"Hello": "World"}),(3, {"Hello": "World"}),(4, {"Hello": "World"})]
预期通过zip拼接原列表和重复字典序列实现需求:
output: list = list(zip(l, repeated_dicts))
核心待解决问题为如何生成指定次数的重复字典序列,尝试itertools.islice、itertools.cycle方案未得到正确结果。
实现方案
首先注意核心避坑点:如果直接重复原字典对象本身,所有元组内的字典会指向同一个内存地址,修改任意一个字典的内容,所有位置的字典都会同步变化。如果需要每个字典为独立实例,需要生成字典副本。
- 方案1:
itertools.repeat实现(性能最优)
这是单元素重复场景最适配的工具,不需要复杂循环拼接逻辑,直接指定重复元素和次数即可:
如果需要每个字典为独立浅副本,替换为生成器表达式即可:import itertools l = [1,2,3,4] d = {"Hello": "World"} # 所有位置共用同一个字典对象(无独立副本需求时使用) repeated_dicts = itertools.repeat(d, len(l)) output = list(zip(l, repeated_dicts))# 每个元素为原字典的浅拷贝,修改单个字典不会影响其他位置 repeated_dicts = (d.copy() for _ in range(len(l))) output = list(zip(l, repeated_dicts)) - 方案2:列表推导式直接生成(无依赖、逻辑最直观)
不需要导入任何模块,直接遍历原列表组装元组即可,代码可读性最高:l = [1,2,3,4] d = {"Hello": "World"} # 不需要独立副本就把d.copy()换成d output = [(num, d.copy()) for num in l] itertools.cycle+islice的正确写法
之前使用这两个方法未成功,一般是切片长度控制错误导致的,正确参考写法如下:
该方案性能弱于import itertools l = [1,2,3,4] d = {"Hello": "World"} # cycle会无限循环传入的可迭代对象,用islice截取前len(l)个元素即可 repeated_dicts = itertools.islice(itertools.cycle([d]), len(l)) output = list(zip(l, repeated_dicts))itertools.repeat,更适合需要循环多个不同元素的场景,单元素重复不推荐优先使用。
补充说明:如果原字典内部存在嵌套可变对象(比如字典中包含列表、其他字典等),浅拷贝
d.copy()无法实现完全独立,需要导入copy模块使用copy.deepcopy(d)生成深拷贝副本。
内容的提问来源于stack exchange,提问作者Coldchain9
相关产品推荐
相关产品推荐

