You need to enable JavaScript to run this app. Python如何将含键值对字符串的嵌套列表转换为指定字典列表并导出JSON
优惠活动
大模型
产品
解决方案
定价
更多

Python如何将含键值对字符串的嵌套列表转换为指定字典列表并导出JSON

方案1:优化原有逻辑,从源头生成可直接序列化的结果

你之前写的代码存在两个核心问题:

  1. 计数逻辑有bug:把统计字典d放在逐行遍历的循环内部,每读一行都会把之前累计的所有发言人的计数重复累加一遍,最终得到的发言次数统计是不准确的
  2. 冗余的字符串拼接:特意把字典格式拼成带单引号的字符串嵌套结构,后续还要额外做解析,很容易出现格式错漏

直接用下面的代码就能一步到位得到符合JSON格式要求的结果,不需要额外转换:

import json
from collections import defaultdict

# 自动初始化新发言人的计数为0,不用手动判断是否存在
chat_counter = defaultdict(int)

# 用with上下文管理器操作文件,读完自动关闭,避免资源泄露
with open("input.txt", "r", encoding="utf-8") as f:
    for line in f:
        # 跳过文件里的空行,避免split时索引越界
        stripped_line = line.strip()
        if not stripped_line:
            continue
        # 按连续的空白字符分割每行,结构为 [时间戳, 发言人..., 聊天内容...]
        line_parts = stripped_line.split()
        # 从第2个元素开始,找到第一个带冒号的元素,就是发言人名字的结尾
        speaker_end_pos = 1
        while speaker_end_pos < len(line_parts) and ":" not in line_parts[speaker_end_pos]:
            speaker_end_pos += 1
        # 拼接所有发言人部分的内容,去掉末尾的冒号
        speaker_name = " ".join(line_parts[1:speaker_end_pos+1]).rstrip(":")
        # 该发言人计数+1
        chat_counter[speaker_name] += 1

# 直接生成符合要求的字典列表,天生支持JSON序列化
result = [
    {"Person": name, "Message": count}
    for name, count in chat_counter.items()
]

# 写入JSON文件,ensure_ascii=False避免中文乱码,indent=4生成可读性好的格式化文件
with open("speaker_message_count.json", "w", encoding="utf-8") as f:
    json.dump(result, f, ensure_ascii=False, indent=4)
方案2:如果已经生成了字符串嵌套列表,转成合法字典结构

如果你已经跑完之前的代码,拿到了类似下面的结构:

[["'Person':Yiyang Chen,'Message':10"], ["'Person':Junbo Sheng,'Message':2"]...]

可以通过拆分字符串的方式还原为合法的字典列表,代码如下:

import json

# 示例的原始嵌套列表
raw_data = [
    ["'Person':Yiyang Chen,'Message':10"],
    ["'Person':Junbo Sheng,'Message':2"]
]

valid_result = []
for entry in raw_data:
    # 取出嵌套里的拼接字符串
    raw_content = entry[0]
    # 按逗号拆分出两个独立的键值对片段
    kv_segments = raw_content.split(",")
    current_dict = {}
    for seg in kv_segments:
        # 去掉所有多余的单引号
        clean_seg = seg.replace("'", "")
        # 只拆分第一个冒号,避免发言人名字里带冒号导致拆分错误
        key, value = clean_seg.split(":", 1)
        # Message字段是整数类型,需要做类型转换
        if key == "Message":
            value = int(value)
        current_dict[key] = value
    valid_result.append(current_dict)

# 转换完成后可直接通过json.dumps序列化
print(json.dumps(valid_result, ensure_ascii=False))

初学者注意事项

  • 处理JSON相关需求时,尽量在生成环节就使用Python原生的字典、列表结构,不要先拼接字符串再回头解析,很容易出现引号不匹配、类型错误的问题
  • 拆分包含冒号的字符串时,优先用split(":", 1)限制拆分次数,避免内容里的特殊符号导致解析错误
  • 调用json.dump/json.dumps时加上ensure_ascii=False参数,否则中文等非ASCII字符会被转成不可读的unicode编码

内容的提问来源于stack exchange,提问作者Simran Makandar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.04 05:15:06