现有txt文件“电影信息.txt”,其中三列分别为电影名称、导演和演员表,之间用分号分隔(同一个电影可能会有多个演员,每个演员姓名之间使用逗号分隔;同一部电影也可能有多个导演,多个导演之间用逗号分隔),如图所示: 使用openpyxl和matplotlab实现电影数据分析任务:任务三:演员组合参演统计 统计所有可能的演员组合在多部电影中的参演情况,并按照指定要求填入sheet中,具体要求如下: 1. 在“电影信息统计.xlsx”文件中新增一个名为“演员组合参演统计”的sheet,分别统计二人组和三人组的情况。 2. 第一列填写演员组合,第二列填写演员组合参演电影数量,第三列填写演员组合参演电影列表。如果同一行中有多部电影,则以逗号(,)分隔。 3. 统计演员组合在所有电影中的参演情况,并按照参演电影数量降序排列,确保数量相同的组合按姓名升序排列。先写三人组合,再写二人组合。 4. 若某三人组合中已完全覆盖了其中的二人组合参演的所有电影,则不再统计该二人组合;若未完全覆盖,则仍需统计该二人组合。一部电影最多只统计出两个三人组合。
时间: 2024-02-13 20:05:01 浏览: 58
Excel2021工作表中如何导入.txt文件.docx
好的,这是一个关于Python数据处理的问题,我会尽力回答。首先,我们需要用openpyxl库读取“电影信息.xlsx”文件中的数据,然后进行统计。以下是代码实现的步骤:
1. 导入所需库
```python
import openpyxl
import itertools
```
2. 打开电影信息.xlsx文件,获取工作表对象
```python
wb = openpyxl.load_workbook('电影信息.xlsx')
ws = wb.active
```
3. 定义一个函数,用于将演员表字符串转换为演员列表
```python
def get_actors(actors_str):
# 将演员表字符串按逗号分隔,得到每个演员的姓名
actors = actors_str.split(',')
# 去除每个演员姓名前后的空格
actors = [actor.strip() for actor in actors]
return actors
```
4. 定义一个字典,用于存储演员组合及其参演电影列表
```python
actor_combinations = {}
```
5. 遍历工作表中的每一行,将演员组合及其参演电影列表存储到字典中
```python
for row in ws.iter_rows(min_row=2, values_only=True):
# 获取电影名称、导演和演员表
movie_title, director, actors_str = row
# 将演员表字符串转换为演员列表
actors = get_actors(actors_str)
# 枚举所有可能的演员组合
for r in range(2, len(actors)+1):
for combination in itertools.combinations(actors, r):
# 将演员组合转换为字符串
combination_str = ', '.join(sorted(combination))
# 如果演员组合已存在于字典中,则将参演电影添加到电影列表中
if combination_str in actor_combinations:
actor_combinations[combination_str]['movies'].append(movie_title)
# 如果演员组合不存在于字典中,则创建新的字典项
else:
actor_combinations[combination_str] = {
'movies': [movie_title],
'count': 0
}
```
6. 统计演员组合参演电影数量并按要求排序,将结果写入新的工作表中
```python
# 创建新的工作表
ws_new = wb.create_sheet('演员组合参演统计')
# 写入表头
ws_new.append(['演员组合', '电影数量', '参演电影列表'])
# 计算演员组合参演电影数量并按要求排序
actor_combinations_list = list(actor_combinations.items())
actor_combinations_list.sort(key=lambda x: (-x[1]['count'], x[0]))
# 统计三人组
for combination, data in actor_combinations_list:
if len(combination.split(', ')) == 3:
# 统计演员组合在所有电影中的参演情况
data['count'] = len(data['movies'])
# 统计演员组合覆盖的二人组合
actor_pairs = list(itertools.combinations(combination.split(', '), 2))
covered_pairs = []
for actor_pair in actor_pairs:
if actor_combinations.get(', '.join(sorted(actor_pair))):
covered_pairs.append(actor_pair)
# 如果演员组合已完全覆盖了其中的二人组合参演的所有电影,则不再统计该二人组合
if all(actor_combinations.get(', '.join(sorted(actor_pair)))['count'] == data['count'] for actor_pair in covered_pairs):
continue
# 如果未完全覆盖,则仍需统计该二人组合
for actor_pair in actor_pairs:
if actor_pair not in covered_pairs:
covered_pairs.append(actor_pair)
# 写入演员组合参演电影数量和参演电影列表
ws_new.append([
combination,
data['count'],
', '.join(sorted(data['movies']))
])
# 统计二人组
for combination, data in actor_combinations_list:
if len(combination.split(', ')) == 2:
# 统计演员组合在所有电影中的参演情况
data['count'] = len(data['movies'])
# 统计演员组合覆盖的二人组合
actor_pairs = list(itertools.combinations(combination.split(', '), 2))
covered_pairs = []
for actor_pair in actor_pairs:
if actor_combinations.get(', '.join(sorted(actor_pair))):
covered_pairs.append(actor_pair)
# 如果演员组合已完全覆盖了其中的二人组合参演的所有电影,则不再统计该二人组合
if all(actor_combinations.get(', '.join(sorted(actor_pair)))['count'] == data['count'] for actor_pair in covered_pairs):
continue
# 写入演员组合参演电影数量和参演电影列表
ws_new.append([
combination,
data['count'],
', '.join(sorted(data['movies']))
])
# 保存工作簿
wb.save('电影信息.xlsx')
```
以上就是实现电影数据分析任务三的代码,可以将所有可能的演员组合在多部电影中的参演情况统计并按要求填入新的工作表中。
阅读全文