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

如何迭代列表提取作者演讲内容到字典并维护状态?

问题描述

我有两个列表:

  • 第一个是作者列表:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 23:50:23