Python迭代字典存值更新:按Speaker存储语音文本的最优方案
解决Python中迭代存储并更新字典的Speaker文本映射问题
我懂你现在的困扰:你想遍历文本列表,把每个Speaker对应的Group和语音文本存储到字典里,但现有的代码每次迭代都会覆盖之前的数据,最后只留下最后一个Speaker的信息,完全不是你想要的结果。
问题出在哪?
你初始化的dictspeaker是单个字典对象,每次循环调用update()都会把里面的键值对替换成当前Speaker的信息,相当于一直在修改同一个字典,而不是为每个Speaker创建独立的条目。最终自然只能得到最后一次迭代的结果。
正确的解决方案
我们需要调整数据结构:用一个外层字典,把每个Speaker的名字作为键,对应的值是包含Group和Text的子字典(如果一个Speaker有多段文本,Text可以用列表来存储多条内容)。这样就能实现每个Speaker的信息独立存储,迭代时只更新对应Speaker的条目。
完整示例代码
import re def speaker_texts(cleanedList): # 外层字典:键为Speaker名称,值为包含Group和Text的子字典 speaker_dict = {} # 正则表达式:匹配Speaker名称和Group(比如 "Alice (GROUP_A)" 这样的格式) pattern_speaker = r"([A-Z]+[a-z]*)\s*\(([A-Z]*)\)" for sent in cleanedList: # 提取当前句子中的Speaker和Group信息 matches = re.findall(pattern_speaker, sent) if matches: # 取第一个匹配结果(假设每个句子只有一个Speaker标识) speaker_name, group = matches[0] # 提取句子中的文本内容:去掉Speaker标识部分 text_content = re.sub(pattern_speaker, "", sent).strip() # 判断当前Speaker是否已经在字典中 if speaker_name in speaker_dict: # 如果存在,追加文本到Text列表 speaker_dict[speaker_name]["Text"].append(text_content) else: # 如果不存在,创建新的条目,Text初始化为列表存储第一条文本 speaker_dict[speaker_name] = { "Group": group, "Text": [text_content] } return speaker_dict
关键说明
- 数据结构设计:外层字典
speaker_dict确保每个Speaker有独立的条目,避免覆盖;用列表存储Text是为了支持一个Speaker有多段语音文本的场景。 - 文本提取:用
re.sub()去掉句子中的Speaker标识部分,得到纯文本内容。 - 迭代更新逻辑:每次迭代先判断Speaker是否已存在,存在则追加文本,不存在则新建条目,保证所有Speaker的信息都被保留。
测试示例
假设你的cleanedList是这样的:
cleanedList = [ "Alice (GROUP_A) Hello everyone!", "Bob (GROUP_B) Hi Alice!", "Alice (GROUP_A) Nice to meet you Bob." ]
调用speaker_texts(cleanedList)后,得到的结果会是:
{ "Alice": { "Group": "GROUP_A", "Text": ["Hello everyone!", "Nice to meet you Bob."] }, "Bob": { "Group": "GROUP_B", "Text": ["Hi Alice!"] } }
这样就完美实现了每个Speaker的信息存储与更新啦~
内容的提问来源于stack exchange,提问作者madik_atma
相关产品推荐
相关产品推荐

