
本文介绍如何通过 python 快速将列表中的单个字典元素按指定次数复制并扩展为包含多个相同字典的新列表,避免索引错误,适用于 json 数据结构动态构建场景。
在处理 JSON 配置或前端模拟数据时,常需将一个基础字典项(如提示语、选项、问答条目)重复生成多份,注入到 _items 这样的列表字段中。直接在循环中反复调用 json.dump() 并不能修改原始列表结构,反而可能因误操作引发 list index out of range 等错误——因为 json.dump() 是写入文件的 I/O 操作,而非列表拼接。
正确做法是先构造好目标列表,再统一序列化。推荐使用列表推导式(List Comprehension),简洁、高效且可读性强:
# 原始数据(含单个字典)
data = [
{
"text": "Hi.",
"feedback": "",
"_score": 0
}
]
# 复制 5 次(即生成 5 个相同字典)
n = 5
_items = [item for item in data for _ in range(n)]
# 此时 _items 即为预期结果:
# [
# {"text": "Hi.", "feedback": "", "_score": 0},
# {"text": "Hi.", "feedback": "", "_score": 0},
# ...(共 5 项)
# ]✅ 关键说明:
- for item in data 遍历原列表(此处仅 1 个元素);
- for _ in range(n) 控制每个 item 被重复插入 n 次;
- 整体等价于 data * n(当 data 仅含不可变/浅层结构时),但列表推导式更显式、更安全,尤其适合嵌套结构需深度复制的场景(此时应配合 copy.deepcopy())。
⚠️ 注意事项:
- 若字典内含可变对象(如嵌套列表、其他字典),直接 * n 或上述推导式会产生引用共享,修改任一副本会影响全部。此时应改用:
import copy _items = [copy.deepcopy(item) for item in data for _ in range(n)]
- 最终写入 JSON 文件时,请确保封装完整结构(例如 {"_items": _items}),再调用 json.dump():
import json output = {"_items": _items} with open("output.json", "w") as f: json.dump(output, f, indent=4)
掌握这种“模板复用+列表扩展”模式,能显著提升配置生成、测试数据构造和 API Mock 的开发效率。









