任务三:演员组合参演统计 统计所有可能的演员组合在多部电影中的参演情况,并按照指定要求填入sheet中,具体要求如下: 1. 在“电影信息统计.xlsx”文件中新增一个名为“演员组合参演统计”的sheet,分别统计二人组和三人组的情况。 2. 第一列填写演员组合,第二列填写演员组合参演电影数量,第三列填写演员组合参演电影列表。如果同一行中有多部电影,则以逗号(,)分隔。 3. 统计演员组合在所有电影中的参演情况,并按照参演电影数量降序排列,确保数量相同的组合按姓名升序排列。先写三人组合,再写二人组合。 4. 若某三人组合中已完全覆盖了其中的二人组合参演的所有电影,则不再统计该二人组合;若未完全覆盖,则仍需统计该二人组合。一部电影最多只统计出两个三人组合。代码怎么写
时间: 2024-02-12 17:07:28 浏览: 96
(中小学教育)三下数学解决问题(二)用连除解决问题课件.ppt
以下是Python代码实现:
```python
import openpyxl
# 读取电影信息
wb = openpyxl.load_workbook('电影信息统计.xlsx')
movies_sheet = wb['电影']
actors_sheet = wb['演员']
movies = {}
for row in movies_sheet.iter_rows(min_row=2, values_only=True):
movie_id, _, actors = row
movies[movie_id] = actors.split(',')
# 统计演员组合参演情况
actor_pairs = {}
actor_triples = {}
for movie_id, actors in movies.items():
actors = sorted(actors)
for i in range(len(actors)):
for j in range(i+1, len(actors)):
pair = (actors[i], actors[j])
if pair not in actor_pairs:
actor_pairs[pair] = {'count': 0, 'movies': []}
actor_pairs[pair]['count'] += 1
if movie_id not in actor_pairs[pair]['movies']:
actor_pairs[pair]['movies'].append(movie_id)
for k in range(j+1, len(actors)):
triple = (actors[i], actors[j], actors[k])
if triple not in actor_triples:
actor_triples[triple] = {'count': 0, 'movies': []}
actor_triples[triple]['count'] += 1
if movie_id not in actor_triples[triple]['movies']:
actor_triples[triple]['movies'].append(movie_id)
# 将结果写入Excel
result_sheet = wb.create_sheet('演员组合参演统计')
result_sheet.append(['演员组合', '演员组合参演电影数量', '演员组合参演电影列表'])
for triple, stats in sorted(actor_triples.items(), key=lambda x: (-x[1]['count'], x[0])):
covered_pairs = set()
for pair in [(triple[0], triple[1]), (triple[0], triple[2]), (triple[1], triple[2])]:
if pair in actor_pairs:
if all(movie_id in stats['movies'] for movie_id in actor_pairs[pair]['movies']):
covered_pairs.add(pair)
else:
result_sheet.append([pair, actor_pairs[pair]['count'], ', '.join(actor_pairs[pair]['movies'])])
if len(covered_pairs) < 3:
result_sheet.append([triple, stats['count'], ', '.join(stats['movies'])])
if result_sheet.max_row > 10000:
break # 最多写入10000行数据
wb.save('电影信息统计.xlsx')
```
代码思路:
首先读取电影信息,将每部电影的演员列表保存在一个字典中。
然后统计演员组合参演情况,使用两个字典分别保存二人组和三人组的统计结果。对于每部电影,对其中所有演员的组合进行遍历,对于每个组合,如果是新出现的,则在对应的字典中创建一个新的条目;如果已经出现过,则将该组合的参演电影数量加一,并将该电影的ID加入到该组合的“参演电影列表”中。
最后将结果写入Excel,按照要求先写三人组再写二人组。对于三人组,还需要判断是否已经完全覆盖了其中的二人组合参演的所有电影,如果是,则不再统计该二人组合。为了提高效率,当写入行数超过10000时,停止写入。
阅读全文