python演员关系分析

一、演员关系分析

实验目的:

  1. 熟悉Python扩展库openpyxl的安装与使用。
  2. 了解Execl文件结构与数据组织形式;
  3. 熟练掌握集合运算以及集合常用方法;

实验内容:

随机生成不少于20条的电影导演演员信息,并将其存放在excel文件“电影导演演员信息.xlsx”,其中内容按照:电影名称、导演、演员 三列分别存放。每部电影至少有四名演员参演,演员总数不超过15个。要求统计所有演员关系中最好的n个演员及其共同参演电影数量,其中n可以制定为大于或等于2的证书。这里关系好定义为共同参演的电影数量最多。

实验要求:

编写程序,使用Python扩展库openpyxl来进行excel表格的写读操作。读取上述生成的电影导演演员信息表格。返回一个字典。在字典中,使用演员作为键,使用包含该演员参演电影名称的集合作为“值”。读取数据时,跳过表头,对于每一行有效数据,获取每一行的电影名称和演员清单,对该电影的参演演员进行分割得到演员列表,列中的每个研究都参演过该行对应的电影。

实验解题:

生成电影导演演员信息.xlsx
首先我们给 电影名称、导演、演员 命名
movies = ['电影1', '电影2', '电影3', '电影4', '电影5', '电影6', '电影7', '电影8', '电影9', '电影10',
          '电影11', '电影12', '电影13', '电影14', '电影15', '电影16', '电影17', '电影18', '电影19', '电影20']
director = ['导演1', '导演2', '导演3', '导演4', '导演5', '导演6', '导演7', '导演8', '导演9', '导演10',
            '导演11', '导演12', '导演13', '导演14', '导演15', '导演16', '导演17', '导演18', '导演19', '导演20']
actor = ['演员1', '演员2', '演员3', '演员4', '演员5', '演员6', '演员7', '演员8',
         '演员9', '演员10', '演员11', '演员12', '演员13', '演员14', '演员15']
使用openpyxl将数据填入表中
import random
from openpyxl import Workbook

# 实例化
wb = Workbook()
# 激活 worksheet
ws = wb.active
# 设置表头
ws.append(['电影名称', '导演', '演员'])
col = ws.column_dimensions['C'] #将演员列拓宽
col.width = 140
for i in range(20):
    acs = []
    ac = [] #每次执行时均清空
    num = random.randint(4,15) #生成演员数量
    while (len(acs) < num):
        x = random.randint(0, 14)
        if x not in acs: #去重
            acs.append(x)
            ac.append(actor[x])
            # 演员输出格式化
            ac2 = ','.join(str(i) for i in ac)
    #生成第i行数据
    ws.append([movies[i], director[i], ac2])

wb.save('电影导演演员信息.xlsx')

在这里插入图片描述

计算
读入信息表
from openpyxl import Workbook, load_workbook

# 打开文件及表
wb = load_workbook('电影导演演员信息.xlsx')
ws = wb["Sheet"]
生成演员所参演的电影字典
'''使用演员作为键,使用包含该演员参演电影名称的集合作为“值”'''
actor_dict = dict()
# 遍历Excel文件中的所有行
for index, row in enumerate(ws.rows):
    # 跳过表头,对于每一行有效数据,获取每一行的电影名称和演员清单,
    if index == 0:
        continue
    # 获取电影名称和演员列表
    filmName, actor = row[0].value, row[2].value.split(',')
    # 遍历该电影的所有演员,统计参演电影
    for a in actor:
        actor_dict[a] = actor_dict.get(a, set())
        actor_dict[a].add(filmName)
actor_list = sorted(actor_dict.items(), key=lambda x: int(x[0][2:]))
actor_dict = dict(actor_list)

print("演员所参演的电影字典:{}".format(actor_dict))
演员所参演的电影字典:{'演员1': {'电影15', '电影10', '电影11', '电影2', '电影19', '电影12',...
找到关系中最好的n个演员
'''要求统计所有演员关系中最好的n个演员及其共同参演电影数量,其中n可以制定为大于或等于2的证书。
这里关系好定义为共同参演的电影数量最多。'''

actorPairs = []
# 遍历演员和参演电影
for index, actor1 in enumerate(actor_list[:-1]):
    for _, actor2 in enumerate(actor_list[index + 1:]):
        # 构建演员组合演员组合,这里方便起见设置n=2
        actorPair = (actor1[0], actor2[0])
        # 共同参演的电影
        films = actor1[1] & actor2[1]
        # 将 演员组合:电影集合 键值对填入序列
        actorPairs.append((actorPair, films))

# 找到一同参演电影次数最多的组合
favoriPair = max(actorPairs, key=lambda item: len(item[1]))
print("关系中最好的2个演员{},共同参演电影数量{}".format(favoriPair[0],len(favoriPair[1])))
关系中最好的2个演员('演员2', '演员7'),共同参演电影数量11
程序运行截图

在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐