如何迭代列表提取作者演讲内容到字典并维护状态?
问题描述
我有两个列表:
- 第一个是作者列表:
authors = ['M. Maxime Gremet', 'M. le président.', 'M.Claude Goasgu', 'M.Jean-Marc Ayr', 'M.Maxime Gremet', 'M.Roland Chassa', 'M.le président.']
- 第二个列表包含作者和文本语句,结构是先出现一位作者,随后是其对应的多条演讲语句,列表里有多位作者及内容:
authors_and_words = ['M. le président.', "Conformément au premier alinéa de l'article 28 de la Constitution, je déclare ouverte la session ordinaire de 2003-2004.", "Mes chers collègues, permettez-moi d'abord de vous dire combien je suis heureux de vous retrouver tous.", 'M. Maxime Gremetz.', 'Nous aussi !']
需要从第二个列表中提取作者和对应演讲内容,最终输出可以是字典组成的列表,结构如下:
{'作者名': ['语句1', '语句2']}
针对示例数据,预期结果是:
solution = [{'M. le président.': ["Conformément au premier alinéa de l'article 28 de la Constitution, je déclare ouverte la session ordinaire de 2003-2004.", "Mes chers collègues, permettez-moi d'abord de vous dire combien je suis heureux de vous retrouver tous."]}, {'M. Maxime Gremetz.':['Nous aussi !']}]
之前尝试用循环实现,但难以维护列表遍历的状态,需要算法层面的解决方案。
解决方案
核心思路是遍历authors_and_words列表时,维护当前正在处理的作者,遇到新作者就结束上一位的内容收集,开始新的。这里提供两种实现方式:
方式一:基础循环实现(直观易理解)
authors = ['M. Maxime Gremet', 'M. le président.', 'M.Claude Goasgu', 'M.Jean-Marc Ayr', 'M.Maxime Gremet', 'M.Roland Chassa', 'M.le président.'] authors_and_words = ['M. le président.', "Conformément au premier alinéa de l'article 28 de la Constitution, je déclare ouverte la session ordinaire de 2003-2004.", "Mes chers collègues, permettez-moi d'abord de vous dire combien je suis heureux de vous retrouver tous.", 'M. Maxime Gremetz.', 'Nous aussi !'] result = [] current_author = None current_speech = [] for item in authors_and_words: # 判断当前项是否是作者,处理名字末尾点号不一致的情况 normalized_item = item.rstrip('.') normalized_authors = [a.rstrip('.') for a in authors] if normalized_item in normalized_authors: # 匹配到作者,先把之前的内容存入结果 if current_author is not None: result.append({current_author: current_speech}) # 更新当前作者,重置演讲内容列表 current_author = item current_speech = [] else: # 如果是语句,添加到当前作者的演讲列表 current_speech.append(item) # 循环结束后,把最后一位作者的内容加入结果 if current_author is not None: result.append({current_author: current_speech}) print(result)
说明
- 用
current_author记录当前正在收集内容的作者,current_speech存储对应的语句 - 对名字做归一化处理(去掉末尾点号),避免因格式差异导致的匹配失败
- 每次遇到作者项,就把之前的作者和内容存入结果,然后切换到新作者
- 循环结束后处理最后一位作者的内容,避免遗漏
方式二:用字典直接存储(更高效,结构可按需调整)
如果不需要列表套字典的结构,直接用一个大字典存储所有作者和对应内容会更高效:
authors = ['M. Maxime Gremet', 'M. le président.', 'M.Claude Goasgu', 'M.Jean-Marc Ayr', 'M.Maxime Gremet', 'M.Roland Chassa', 'M.le président.'] authors_and_words = ['M. le président.', "Conformément au premier alinéa de l'article 28 de la Constitution, je déclare ouverte la session ordinaire de 2003-2004.", "Mes chers collègues, permettez-moi d'abord de vous dire combien je suis heureux de vous retrouver tous.", 'M. Maxime Gremetz.', 'Nous aussi !'] result_dict = {} current_author = None # 先统一处理作者名的格式,避免点号差异导致匹配失败 normalized_authors = {a.rstrip('.'): a for a in authors} for item in authors_and_words: normalized_item = item.rstrip('.') if normalized_item in normalized_authors: # 匹配到作者,取原始格式的作者名 current_author = normalized_authors[normalized_item] # 如果字典里还没有这个作者,初始化空列表 if current_author not in result_dict: result_dict[current_author] = [] elif current_author is not None: # 是语句,添加到当前作者的列表 result_dict[current_author].append(item) # 如果需要转换成列表套字典的格式,执行下面的代码 result = [{k: v} for k, v in result_dict.items()] print(result)
说明
- 先对作者列表做归一化处理,解决名字末尾点号不一致的问题
- 用大字典存储,查询和添加操作更高效
- 最后可按需转换成用户需要的列表套字典结构
内容的提问来源于stack exchange,提问作者LLaP
相关产品推荐
相关产品推荐

