You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让itertools.zip_longest的可变fillvalue生成独立dict实例?

解决itertools.zip_longest填充独立字典实例的问题

核心问题在于:itertools.zip_longest的fillvalue参数是提前创建好的单一实例,如果传入可变对象(比如dict()),所有缺值位置都会复用这个实例的引用,修改其中一个会影响所有填充项。

可行解决方案

方案1:生成器表达式动态创建新字典

用None作为临时填充值,再通过生成器表达式将每个None替换为新的空字典,确保每次缺值都生成独立实例:

from itertools import zip_longest

list_a = [{"id": 1}, {"id": 2}]
list_b = [{"name": "Alice"}]

# 生成器版本(内存友好,适合大数据量)
zip_result = ((a if a is not None else {}, b if b is not None else {}) 
              for a, b in zip_longest(list_a, list_b, fillvalue=None))

# 验证独立性
items = list(zip_result)
items[1][0]["id"] = 3
print(items[0][0])  # 输出 {'id': 1},不受后续修改影响
print(items[1][0])  # 输出 {'id': 3}

方案2:列表推导式直接生成结果列表

如果需要直接得到列表而非生成器,用列表推导式处理每个分组:

from itertools import zip_longest

list_a = [{"id": 1}, {"id": 2}]
list_b = [{"name": "Alice"}]

# 列表推导式版本
zip_result = [tuple(item if item is not None else {} for item in group) 
              for group in zip_longest(list_a, list_b, fillvalue=None)]

为什么之前的尝试无效?

  • 直接传fillvalue=dict():只会创建一次空字典,所有缺值位置复用同一引用。
  • 传fillvalue=copy.deepcopy(dict()):deepcopy仅在传入参数时执行一次,本质还是单一实例,无法解决复用问题。

内容的提问来源于stack exchange,提问作者Wör Du Schnaffzig

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 01:37:07