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

Python中构建演员合作关系字典的实现问题

生成演员合作列表问题

需求说明

实现功能:根据给定的影片演员阵容数据,生成每个演员的合作演员列表,要求同一合作演员即使共同参演多部影片也只保留一次。

示例输入

cast_info = [[
  {'name': 'Drew Barrymore'},
  {'name': 'Brian Herzlinger'},
  {'name': 'Corey Feldman'},
  {'name': 'Eric Roberts'}, {'name': 'Griffin Dunne'}, {'name': 'Samuel L. Jackson'}, {'name': 'Matt LeBlanc'}, {'name': "Bill D'Elia"}], [{'name': 'Erich Anderson'}, {'name': 'Judie Aronson'}, {'name': 'Peter Barton'}, {'name': 'Kimberly Beck'}, {'name': 'Tom Everett'}, {'name': 'Flashlight Man'}, {'name': 'Corey Feldman'}]]

预期输出

{'Drew Barrymore': ['Brian Herzlinger', 'Corey Feldman', 'Eric Roberts', 'Griffin Dunne', 'Samuel L. Jackson', 'Matt LeBlanc', "Bill D'Elia"],
 'Brian Herzlinger': ['Drew Barrymore', 'Corey Feldman', 'Eric Roberts', 'Griffin Dunne', 'Samuel L. Jackson', 'Matt LeBlanc', "Bill D'Elia"],
 'Corey Feldman': ['Drew Barrymore', 'Brian Herzlinger', 'Eric Roberts', 'Griffin Dunne', 'Samuel L. Jackson', 'Matt LeBlanc', "Bill D'Elia", 'Erich Anderson', 'Judie Aronson', 'Peter Barton', 'Kimberly Beck', 'Tom Everett', 'Flashlight Man'],
 'Eric Roberts': ['Drew Barrymore', 'Brian Herzlinger', 'Corey Feldman', 'Griffin Dunne', 'Samuel L. Jackson', 'Matt LeBlanc', "Bill D'Elia"],
 'Griffin Dunne': ['Drew Barrymore', 'Brian Herzlinger', 'Corey Feldman', 'Eric Roberts', 'Samuel L. Jackson', 'Matt LeBlanc', "Bill D'Elia"],
 'Samuel L. Jackson': ['Drew Barrymore', 'Brian Herzlinger', 'Corey Feldman', 'Eric Roberts', 'Griffin Dunne', 'Matt LeBlanc', "Bill D'Elia"],
 'Matt LeBlanc': ['Drew Barrymore', 'Brian Herzlinger', 'Corey Feldman', 'Eric Roberts', 'Griffin Dunne', 'Samuel L. Jackson', "Bill D'Elia"],
 "Bill D'Elia": ['Drew Barrymore', 'Brian Herzlinger', 'Corey Feldman', 'Eric Roberts', 'Griffin Dunne', 'Samuel L. Jackson', 'Matt LeBlanc'],
 'Erich Anderson': ['Judie Aronson', 'Peter Barton', 'Kimberly Beck', 'Tom Everett', 'Flashlight Man', 'Corey Feldman'],
 'Judie Aronson': ['Erich Anderson', 'Peter Barton', 'Kimberly Beck', 'Tom Everett', 'Flashlight Man', 'Corey Feldman'],
 'Peter Barton': ['Erich Anderson', 'Judie Aronson', 'Kimberly Beck', 'Tom Everett', 'Flashlight Man', 'Corey Feldman'],
 'Kimberly Beck': ['Erich Anderson', 'Judie Aronson', 'Peter Barton', 'Tom Everett', 'Flashlight Man', 'Corey Feldman'],
 'Tom Everett': ['Erich Anderson', 'Judie Aronson', 'Peter Barton', 'Kimberly Beck', 'Flashlight Man', 'Corey Feldman'],
 'Flashlight Man': ['Erich Anderson', 'Judie Aronson', 'Peter Barton', 'Kimberly Beck', 'Tom Everett', 'Corey Feldman']}

注意:演员Corey Feldman的合作演员需包含两部影片中的其他演员。

当前代码的问题

你写的代码存在以下几个问题:

  1. 逻辑无效:actor_name2 != list_of_actors[0]只是做了一个比较操作,没有对actor_name2做任何修改,所以当actor['name']等于list_of_actors[0]时,依然会把该演员自己添加到列表中;
  2. 仅处理单个演员:代码只针对list_of_actors[0]这一个演员处理,没有遍历所有演员生成对应的合作列表;
  3. 无去重机制:没有处理重复添加的问题,同一合作演员会被多次添加。
for film_cast in cast_info:
    for actor in film_cast:
        if list_of_actors[0] in actor['name']:
            actor_name2 = actor['name'] 
            actor_name2 != list_of_actors[0]  # 这行代码无实际作用
            costars_lists[0].append(actor_name2) 

解决方案

实现思路

  1. 先提取所有演员的姓名,确保不会遗漏任何需要生成合作列表的对象;
  2. 用集合存储每个演员的合作演员,利用集合自动去重的特性,避免手动判断重复;
  3. 遍历每一部影片的演员阵容,对阵容中的每个演员,将同阵容的其他演员添加到他的合作集合中;
  4. 最后将集合转换为列表,整理成字典格式输出。

代码实现

cast_info = [[
  {'name': 'Drew Barrymore'},
  {'name': 'Brian Herzlinger'},
  {'name': 'Corey Feldman'},
  {'name': 'Eric Roberts'}, {'name': 'Griffin Dunne'}, {'name': 'Samuel L. Jackson'}, {'name': 'Matt LeBlanc'}, {'name': "Bill D'Elia"}], [{'name': 'Erich Anderson'}, {'name': 'Judie Aronson'}, {'name': 'Peter Barton'}, {'name': 'Kimberly Beck'}, {'name': 'Tom Everett'}, {'name': 'Flashlight Man'}, {'name': 'Corey Feldman'}]]

# 提取所有演员姓名,用集合避免重复
all_actors = {actor['name'] for film in cast_info for actor in film}
# 初始化合作演员字典,每个演员对应一个空集合
costar_dict = {actor: set() for actor in all_actors}

# 遍历每部影片的演员阵容
for film_cast in cast_info:
    # 提取当前影片的所有演员姓名
    current_film_actors = [actor['name'] for actor in film_cast]
    # 为当前影片的每个演员添加合作演员
    for actor in current_film_actors:
        for costar in current_film_actors:
            if actor != costar:
                costar_dict[actor].add(costar)

# 将集合转换为列表(可选排序,让输出更整齐)
result = {actor: sorted(list(costars)) for actor, costars in costar_dict.items()}

# 打印结果
import pprint
pprint.pprint(result)

代码说明

  • 用集合存储合作演员,自动解决重复添加的问题,无需手动检查是否已存在;
  • 先提取所有演员,确保覆盖所有需要生成合作列表的对象;
  • 遍历影片时先提取当前影片的演员姓名列表,避免重复从字典中读取数据,提升效率;
  • 最后将集合转为列表并排序,输出格式与预期一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 02:35:16