统计所有可能的演员组合在多部电影中的参演情况,并按照指定要求填入sheet中,具体要求如下: 1. 在“电影信息统计.xlsx”文件中新增一个名为“演员组合参演统计”的sheet,分别统计二人组和三人组的情况。 2. 第一列填写演员组合,第二列填写演员组合参演电影数量,第三列填写演员组合参演电影列表。如果同一行中有多部电影,则以逗号(,)分隔。 3. 统计演员组合在所有电影中的参演情况,并按照参演电影数量降序排列,确保数量相同的组合按姓名的中文排序升序排列。先写三人组合,再写二人组合。 4. 若某三人组合中已完全覆盖了其中的二人组合参演的所有电影,则不再统计该二人组合;若未完全覆盖,则仍需统计该二人组合。一部电影最多只统计出两个三人组合。代码怎么写
时间: 2024-02-13 12:04:26 浏览: 113
为了实现这个需求,我们需要使用Python中的Pandas库,以下是实现的代码:
```python
import pandas as pd
# 读取电影信息
movies_df = pd.read_excel('电影信息统计.xlsx', sheet_name='电影信息')
# 获取所有演员名称
actors = set()
for index, row in movies_df.iterrows():
actors.update(row['演员'].split('/'))
# 统计二人组和三人组的参演情况
actor_combinations_2 = set()
actor_combinations_3 = set()
for index, row in movies_df.iterrows():
movie_actors = set(row['演员'].split('/'))
for actor_combination in actor_combinations_2.copy():
if actor_combination.issubset(movie_actors):
actor_combinations_2.remove(actor_combination)
for actor_combination in actor_combinations_3.copy():
if actor_combination.issubset(movie_actors):
actor_combinations_3.remove(actor_combination)
actor_combinations_2.add(actor_combination)
for actor_combination in combinations(movie_actors, 2):
actor_combinations_2.add(actor_combination)
for actor_combination in combinations(movie_actors, 3):
if not any(actor_combination.issubset(ac) for ac in actor_combinations_3):
actor_combinations_3.add(actor_combination)
# 统计演员组合在所有电影中的参演情况
actor_combinations_2_stats = []
actor_combinations_3_stats = []
for actor_combination in sorted(actor_combinations_3, key=lambda x: (len(x), *x)):
movie_list = []
for index, row in movies_df.iterrows():
movie_actors = set(row['演员'].split('/'))
if actor_combination.issubset(movie_actors):
movie_list.append(row['电影名称'])
actor_combinations_3_stats.append([','.join(sorted(actor_combination)), len(movie_list), ','.join(movie_list)])
for actor_combination in sorted(actor_combinations_2, key=lambda x: (len(x), *x)):
if any(actor_combination.issubset(ac) for ac in actor_combinations_3):
continue
movie_list = []
for index, row in movies_df.iterrows():
movie_actors = set(row['演员'].split('/'))
if actor_combination.issubset(movie_actors):
movie_list.append(row['电影名称'])
actor_combinations_2_stats.append([','.join(sorted(actor_combination)), len(movie_list), ','.join(movie_list)])
# 保存演员组合参演统计结果到Excel文件中
stats_df = pd.DataFrame(columns=['演员组合', '演员组合参演电影数量', '演员组合参演电影列表'])
stats_df = stats_df.append(pd.DataFrame(actor_combinations_3_stats, columns=stats_df.columns), ignore_index=True)
stats_df = stats_df.append(pd.DataFrame(actor_combinations_2_stats, columns=stats_df.columns), ignore_index=True)
stats_df = stats_df.sort_values(by=['演员组合参演电影数量', '演员组合'], ascending=[False, True])
stats_df.to_excel('电影信息统计.xlsx', sheet_name='演员组合参演统计', index=False)
```
该代码会读取名为“电影信息统计.xlsx”文件中的“电影信息”sheet,然后统计所有可能的演员组合在多部电影中的参演情况,并将结果保存到名为“演员组合参演统计”的sheet中。具体实现如下:
1. 首先获取所有演员名称,并初始化二人组和三人组的参演情况为空集合。
2. 遍历所有电影信息,对于每部电影,将演员名称拆分成集合,并依次与二人组和三人组的参演情况进行比对。如果某个演员组合已经完全覆盖了当前电影中的所有演员,则将该组合从二人组或三人组的参演情况中删除;如果某个三人组合已经完全覆盖了当前电影中的所有二人组合,则将该二人组合从二人组的参演情况中删除,同时将该三人组合添加到三人组的参演情况中;否则,将当前电影中的所有二人组合和三人组合分别添加到二人组和三人组的参演情况中。
3. 统计所有演员组合在所有电影中的参演情况,先统计三人组合,再统计二人组合。遍历所有三人组合,依次遍历所有电影,如果该三人组合在当前电影中参演,则将该电影名称添加到该三人组合的参演电影列表中。遍历所有二人组合,如果该二人组合已经被某个三人组合完全覆盖了,则跳过该二人组合;否则,依次遍历所有电影,如果该二人组合在当前电影中参演,则将该电影名称添加到该二人组合的参演电影列表中。
4. 将演员组合参演统计结果保存到Excel文件中的“演员组合参演统计”sheet中,按照参演电影数量降序排列,确保数量相同的组合按姓名的中文排序升序排列。
阅读全文