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的合作演员需包含两部影片中的其他演员。
当前代码的问题
你写的代码存在以下几个问题:
- 逻辑无效:
actor_name2 != list_of_actors[0]只是做了一个比较操作,没有对actor_name2做任何修改,所以当actor['name']等于list_of_actors[0]时,依然会把该演员自己添加到列表中; - 仅处理单个演员:代码只针对
list_of_actors[0]这一个演员处理,没有遍历所有演员生成对应的合作列表; - 无去重机制:没有处理重复添加的问题,同一合作演员会被多次添加。
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)
解决方案
实现思路
- 先提取所有演员的姓名,确保不会遗漏任何需要生成合作列表的对象;
- 用集合存储每个演员的合作演员,利用集合自动去重的特性,避免手动判断重复;
- 遍历每一部影片的演员阵容,对阵容中的每个演员,将同阵容的其他演员添加到他的合作集合中;
- 最后将集合转换为列表,整理成字典格式输出。
代码实现
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
相关产品推荐
相关产品推荐

