算法应用主题赛 · Python · 共 14 题(5单选+5多选+4编程)· 满分 100 分
inheritors = {
"剪纸": {"蔚县": 120, "扬州": 85, "佛山": 60},
"皮影": {"唐山": 95, "华县": 72, "海宁": 50}
}
print(inheritors["剪纸"]["扬州"])inheritors["剪纸"] 获取内层字典,再 ["扬州"] 获取值 85patterns = [i * i for i in range(1, 6) if i % 2 == 0]
print(patterns)range(1, 6) 产生1~5,筛选 i % 2 == 0(偶数)得到2和4,再计算 i * i 得到 [4, 16]a 和 b 的值分别是什么?def analyze_show(name, minutes):
hours = minutes // 60
remain = minutes % 60
return hours, remain
a, b = analyze_show("大闹天宫", 125)
print(a, b)125 // 60 = 2(小时),125 % 60 = 5(剩余分钟)import ______
today = ______.date.today()
print(today)datetime 模块提供了 date、datetime、timedelta 等类,适合进行日期计算;time 模块主要用于时间戳和睡眠等操作scores = [85, 92, 78, 90, 88]
# 方式一
result1 = sorted(scores)
# 方式二
scores.sort()
result2 = scoressorted() 与 list.sort() 的区别——sorted() 是内置函数,返回新列表,不改变原列表(A错、C对);sort() 是列表的方法,原地排序,返回 None(B错);二者功能相似但行为不同(D错)grid = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]grid[0] 是第一行 [1,2,3],其索引1为 2(A对);len(grid) 返回行数3(B对);grid[2] 是第3行(C对);grid[1] 是第2行 [4,5,6],其索引2为 6(D对)global 声明(C对);生命周期不同(D对)a = {1, 2, 3, 4}
b = {3, 4, 5, 6}|(A对)、交集 &(B对)、差集 -(C对)、对称差集 ^(D对)split() 拆分(A对);join() 连接(B对);encode() 编码(C对);swapcase() 大小写互换(D对)read() 读全部(A对);readline() 读一行(B对);readlines() 读所有行返回列表(C对);write() 不会自动添加换行符,需手动添加 \n(D错)题目描述:
舞龙是中华民族传统民俗文化活动。在一次非遗文化节上,需要编排一个 n 行 m 列的舞龙方阵。每位表演者的位置用一个数字编号表示,从1开始按先行后列的顺序依次编号。请编写程序,输入行数 n 和列数 m,输出完整的方阵编号(二维列表形式),并计算方阵四个角落位置的编号之和。
输入格式:
输出格式:
- 先输出完整的方阵,每行数字空格分隔
- 最后一行:四个角落编号之和:{和}
四个角落:左上角(第1行第1列)、右上角(第1行第m列)、左下角(第n行第1列)、右下角(第n行第m列)
示例输入:
示例输出:
# 读取行列数
n, m = map(int, input().split())
# 生成方阵
grid = []
num = 1
for i in range(n):
row = []
for j in range(m):
row.append(num)
num += 1
grid.append(row)
# 输出方阵
for row in grid:
print(' '.join(map(str, row)))
# 计算四个角落编号之和
top_left = grid[0][0]
top_right = grid[0][m - 1]
bottom_left = grid[n - 1][0]
bottom_right = grid[n - 1][m - 1]
corner_sum = top_left + top_right + bottom_left + bottom_right
print(f"四个角落编号之和:{corner_sum}")
题目描述:
某非遗保护中心需要为每项非遗技艺生成档案文件。请编写程序,输入一项非遗技艺的基本信息,将格式化后的档案内容写入文件 heritage_record.txt 中。
档案格式如下:
========== 非遗技艺档案 ==========
项目名称:{名称}
所属类别:{类别}
传承地区:{地区}
保护等级:{等级}
建档日期:{日期}
==================================
输入格式:
- 第一行:项目名称
- 第二行:所属类别
- 第三行:传承地区
- 第四行:保护等级(国家级/省级/市级)
- 第五行:建档日期(格式如 2024-08-15)
输出格式:
- 屏幕输出:档案已保存至 heritage_record.txt
- 文件内容:按上述格式生成的档案文本
示例输入:
示例输出:
# 读取非遗技艺信息
name = input().strip()
category = input().strip()
region = input().strip()
level = input().strip()
date = input().strip()
# 构建档案内容
content = "========== 非遗技艺档案 ==========\n"
content += f"项目名称:{name}\n"
content += f"所属类别:{category}\n"
content += f"传承地区:{region}\n"
content += f"保护等级:{level}\n"
content += f"建档日期:{date}\n"
content += "==================================\n"
# 写入文件
with open("heritage_record.txt", "w", encoding="utf-8") as f:
f.write(content)
# 屏幕提示
print("档案已保存至 heritage_record.txt")
题目描述:
某非遗传承基地记录了不同工艺项目所需的材料清单,数据以嵌套字典形式存储,格式如下:
- 外层字典的键是工艺名称,值是内层字典
- 内层字典的键是材料名称,值是所需数量(整数)
请编写程序完成以下任务:
1. 列出每个工艺项目所需的总材料种类数
2. 统计所有项目中,哪种材料被使用得最多(按总数量计算),输出材料名称和总数量
3. 按工艺名称的字母升序输出所有工艺及其材料清单
已知数据(程序内置):
crafts = {
"剪纸": {"红纸": 10, "剪刀": 2, "刻刀": 1},
"刺绣": {"丝线": 20, "绣布": 5, "绣针": 3, "绣绷": 1},
"陶艺": {"陶土": 15, "釉料": 8, "转盘": 1},
"蜡染": {"白布": 6, "蜂蜡": 3, "染料": 5, "蜡刀": 2}
}
输入格式:
输出格式:
- 第一部分:每个工艺一行,格式为 {工艺名}共需{数量}种材料
- 第二部分:一行,格式为 使用最多的材料:{材料名}(共{数量}个单位)
- 第三部分:按工艺名升序输出完整清单,每种工艺一行,格式为 {工艺名}:{材料1}×{数量}, {材料2}×{数量}, ...
示例输入:
示例输出:
# 内置工艺材料数据
crafts = {
"剪纸": {"红纸": 10, "剪刀": 2, "刻刀": 1},
"刺绣": {"丝线": 20, "绣布": 5, "绣针": 3, "绣绷": 1},
"陶艺": {"陶土": 15, "釉料": 8, "转盘": 1},
"蜡染": {"白布": 6, "蜂蜡": 3, "染料": 5, "蜡刀": 2}
}
# 任务1:统计每种工艺的材料种类数
for name, materials in crafts.items():
print(f"{name}共需{len(materials)}种材料")
# 任务2:统计所有材料的总使用量
material_total = {}
for name, materials in crafts.items():
for mat, qty in materials.items():
if mat in material_total:
material_total[mat] += qty
else:
material_total[mat] = qty
# 找使用最多的材料
max_mat = ""
max_qty = 0
for mat, qty in material_total.items():
if qty > max_qty:
max_qty = qty
max_mat = mat
print(f"使用最多的材料:{max_mat}(共{max_qty}个单位)")
# 任务3:按工艺名升序输出完整清单
for name in sorted(crafts.keys()):
materials = crafts[name]
parts = []
for mat, qty in materials.items():
parts.append(f"{mat}×{qty}")
print(f"{name}:{', '.join(parts)}")
题目描述:
二十四节气是中国古代订立的一种用来指导农事的补充历法。在公历中,每个节气对应的日期大致固定,前后相差不过1~2天。请编写程序,使用 datetime 模块完成以下任务:
1. 用户输入一个年份(如2024)、一个月份(如3)和一个日期(如20)
2. 程序判断该日期属于哪个节气(根据节气的大致日期范围判断)
3. 输出该日期对应的节气名称,以及距离下一个节气的天数
简化起见,以3~5月(春季)的节气为例,各节气的公历大致日期范围如下:
| 节气 | 大致日期范围 |
|------|------------|
| 立春 | 2月3日~2月5日 |
| 雨水 | 2月18日~2月20日 |
| 惊蛰 | 3月5日~3月7日 |
| 春分 | 3月20日~3月22日 |
| 清明 | 4月4日~4月6日 |
| 谷雨 | 4月19日~4月21日 |
| 立夏 | 5月5日~5月7日 |
| 小满 | 5月20日~5月22日 |
判断规则:输入日期在哪个节气的日期范围内(前后允许1天误差),即属于该节气。如果输入日期不在上表中任何节气的范围内,判断该日期处于哪两个节气之间,输出"位于{前一节气}与{后一节气}之间",并计算距离后一个节气(后续的那个节气的大致日期)的天数。
输入格式:
输出格式:
- 如果命中某个节气:第一行输出 {月}月{日}日是{节气名称},第二行输出 距离下一个节气还有约{天数}天
- 如果处于两个节气之间:第一行输出 {月}月{日}日位于{前一节气}与{后一节气}之间,第二行输出 距离{后一节气}还有约{天数}天
示例输入1:
2024 3 20
示例输出1:
3月20日是春分
距离下一个节气还有约15天
示例输入2:
2024 3 15
示例输出2:
3月15日位于惊蛰与春分之间
距离春分还有约5天
示例输入:
示例输出:
from datetime import date, timedelta
# 读取日期
y, m, d = map(int, input().split())
# 节气的基础日期(取大致中间的日期,即范围的首日)
# 格式:(月, 日, 节气名称)
terms = [
(2, 3, "立春"),
(2, 18, "雨水"),
(3, 5, "惊蛰"),
(3, 20, "春分"),
(4, 4, "清明"),
(4, 19, "谷雨"),
(5, 5, "立夏"),
(5, 20, "小满")
]
# 判断输入日期属于哪个节气(±1天容差)
input_date = date(y, m, d)
found = None
for i, (tm, td, name) in enumerate(terms):
term_date = date(y, tm, td)
diff = abs((input_date - term_date).days)
if diff <= 1:
found = i
break
if found is not None:
# 命中某个节气
term_name = terms[found][2]
print(f"{m}月{d}日是{term_name}")
# 下一个节气(如果不是最后一个)
if found < len(terms) - 1:
next_tm, next_td, next_name = terms[found + 1]
next_date = date(y, next_tm, next_td)
days_left = (next_date - input_date).days
print(f"距离下一个节气还有约{days_left}天")
else:
print("这是本季最后一个节气")
else:
# 未命中,判断处于哪两个节气之间
for i in range(len(terms) - 1):
prev_term = date(y, terms[i][0], terms[i][1])
next_term = date(y, terms[i + 1][0], terms[i + 1][1])
if prev_term < input_date < next_term:
print(f"{m}月{d}日位于{terms[i][2]}与{terms[i+1][2]}之间")
days_left = (next_term - input_date).days
print(f"距离{terms[i+1][2]}还有约{days_left}天")
break