🔒 答案已锁定

📖 答案解析 — 智传民韵(民族文化) — 中等(卷三)

算法应用主题赛 · Python · 共 14 题(5单选+5多选+4编程)· 满分 100 分

第 1 题 单选题 2 分
傣族泼水节上,人们互相泼洒清水表达祝福。以下代码使用lambda表达式对祝福语按字数从少到多排序,输出结果是?
blessings = ["如意吉祥", "水", "健康平安幸福", "快乐"]
result = sorted(blessings, key=lambda x: len(x))
print(result)
A. ['水', '快乐', '如意吉祥', '健康平安幸福']
B. ['健康平安幸福', '如意吉祥', '快乐', '水']
C. ['如意吉祥', '水', '健康平安幸福', '快乐']
D. ['如意吉祥', '快乐', '健康平安幸福', '水']
✅ 正确答案:A
💡 考点解析:lambda表达式——匿名函数的定义与在sorted()中的key参数应用
第 2 题 单选题 2 分
蒙古族那达慕大会上有多项传统比赛项目。以下代码使用enumerate()函数为比赛项目编号,输出结果是?
events = ["摔跤", "赛马", "射箭", "套马"]
for i, event in enumerate(events, start=1):
    print(f"{i}.{event}", end=" ")
A. 0.摔跤 1.赛马 2.射箭 3.套马
B. 1.摔跤 2.赛马 3.射箭 4.套马
C. 摔跤 赛马 射箭 套马
D. 1:摔跤 2:赛马 3:射箭 4:套马
✅ 正确答案:B
💡 考点解析:enumerate()函数——同时获取索引和元素,start参数指定起始编号
第 3 题 单选题 2 分
彝族火把节的传统活动分布在不同的日期举行。以下代码使用zip()函数将活动名称与日期合并,输出结果是?
activities = ["祭火", "斗牛", "赛马"]
dates = ["六月廿四", "六月廿五", "六月廿六"]
result = list(zip(activities, dates))
print(result)
A. ["祭火", "斗牛", "赛马", "六月廿四", "六月廿五", "六月廿六"]
B. {"祭火": "六月廿四", "斗牛": "六月廿五", "赛马": "六月廿六"}
C. [("祭火", "六月廿四"), ("斗牛", "六月廿五"), ("赛马", "六月廿六")]
D. [("六月廿四", "祭火"), ("六月廿五", "斗牛"), ("六月廿六", "赛马")]
✅ 正确答案:C
💡 考点解析:zip()函数——将多个可迭代对象按位置配对,返回由元组组成的迭代器
第 4 题 单选题 2 分
藏族唐卡绘制中会使用多种矿物颜料,不同颜料的原价各不相同。以下代码使用map()函数对所有颜料价格统一打9折,输出结果是?
prices = [50, 80, 120, 200]
discount = list(map(lambda x: x * 0.9, prices))
print(discount)
A. [45.0, 72.0, 108.0, 180.0]
B. [45, 72, 108, 180]
C. [50, 80, 120, 200]
D. 报错(map()不能与lambda一起使用)
✅ 正确答案:A
💡 考点解析:map()函数——对可迭代对象的每个元素应用指定函数,返回浮点数结果
第 5 题 单选题 2 分
侗族鼓楼的建造数量需要统计。以下代码中使用了全局变量,最终的输出结果是?
count = 0
def build_tower():
    global count
    count = count + 1
    return count
build_tower()
build_tower()
build_tower()
print(count)
A. 0
B. 1
C. 3
D. 报错(函数内不能修改全局变量)
✅ 正确答案:C
💡 考点解析:变量作用域——global关键字声明全局变量,允许在函数内部修改全局变量的值
第 6 题 多选题 4 分
维吾尔族木卡姆套曲数据以元组列表形式存储,每条记录为(套曲名称, 演奏时长)。以下关于sorted()中key参数的说法,哪些是正确的?
muqam = [("拉克木卡姆", 120), ("且比亚特木卡姆", 90),
         ("木夏吾莱克木卡姆", 150), ("恰尔尕木卡姆", 90)]
A. sorted(muqam, key=lambda x: x[1]) 可以按演奏时长从小到大排序
B. sorted(muqam, key=lambda x: len(x[0])) 可以按套曲名称的字符数从小到大排序
C. sorted(muqam, key=lambda x: (-x[1], x[0])) 先按时长从大到小排序,时长相同则按名称从小到大排序
D. sorted(muqam, key=lambda x: x[0]) 可以按套曲名称的字符串默认顺序排序
✅ 正确答案:ABCD
💡 考点解析:列表排序的key参数高级用法——使用lambda表达式自定义排序规则,支持多级排序
第 7 题 多选题 4 分
苗族银饰制作涉及多种传统工艺。给定一个用逗号分隔的工艺名称字符串,以下关于join()和split()组合应用的说法,哪些是正确的?
crafts = "熔炼,锻打,錾刻,花丝,镶嵌"
A. crafts.split(",") 的结果是 ["熔炼", "锻打", "錾刻", "花丝", "镶嵌"]
B. ",".join(["熔炼", "锻打", "錾刻", "花丝", "镶嵌"]) 的结果是 "熔炼,锻打,錾刻,花丝,镶嵌"
C. " ".join(crafts.split(",")) 的结果是 "熔炼 锻打 錾刻 花丝 镶嵌"(将逗号替换为空格)
D. len(crafts.split(",")) 的结果是 5
✅ 正确答案:ABCD
💡 考点解析:字符串join()与split()的组合应用——split()拆分字符串为列表,join()将列表合并为字符串
第 8 题 多选题 4 分
壮族壮锦图案数据库使用字典管理各类图案的库存数量。对于字典的常用方法,以下哪些说法是正确的?
patterns = {"龙凤纹": 5, "回字纹": 3, "云雷纹": 2}
A. patterns.update({"云雷纹": 5, "花卉纹": 4}) 执行后,"云雷纹"的值变为5,同时新增键值对"花卉纹":4
B. patterns.pop("回字纹") 会从字典中移除"回字纹"这一项,并返回其对应的值3
C. patterns.setdefault("花卉纹", 4) 在"花卉纹"不存在时,会添加该键值对并返回4;若已存在则返回已有的值而不修改
D. patterns.pop("铜鼓纹", "未收录") 在"铜鼓纹"不存在时,返回默认值"未收录"而不会报错
✅ 正确答案:ABCD
💡 考点解析:字典的update()、pop()、setdefault()方法——更新键值、安全删除键、条件性设置默认值
第 9 题 多选题 4 分
土家族摆手舞的动作序列可以用迭代器逐一遍历。以下关于生成器和迭代器的说法,哪些是正确的?
A. 生成器(generator)是一种特殊的迭代器,可以使用yield关键字来创建
B. 使用iter()函数可以将列表、元组等可迭代对象转换为迭代器
C. 生成器会一次性生成所有数据并全部存储在内存中,因此访问速度快
D. 使用next()函数可以从迭代器中逐个取出元素,当没有更多元素时会抛出StopIteration异常
✅ 正确答案:ABD
💡 考点解析:生成器与迭代器概念——生成器使用yield惰性求值(C错误,生成器不会一次性生成所有值),iter()创建迭代器,next()获取下一个元素
第 10 题 多选题 4 分
哈尼梯田的层级结构可以用递归或迭代的方式遍历。以下关于递归与迭代的说法,哪些是正确的?
A. 递归函数必须包含终止条件(基线条件),否则会导致无限递归
B. 在Python中,迭代通常比递归消耗更少的内存,因为递归每次调用都会在调用栈上增加一层
C. Python对递归的深度没有任何限制,可以无限递归下去
D. 对于某些问题(如树的遍历、分治算法),递归可以使代码更加简洁、易读
✅ 正确答案:ABD
💡 考点解析:递归与迭代的对比——递归需要基线条件、占用调用栈(Python默认递归深度约1000,C错误)、适合树/分治场景
第 11 题 编程操作题 15 分

题目描述:
某民族文化展览会上,主办方收集了n件来自不同民族的手工艺品,希望将这些工艺品两两配对进行联合展示。配对规则是:两件工艺品必须来自不同的民族。请编写程序,找出所有满足条件的不同民族配对组合。
注意:(A, B)和(B, A)被视为同一对,只需要输出一次。

输入格式:
第一行输入一个整数n(1 ≤ n ≤ 100),表示手工艺品的数量。
接下来n行,每行输入一个字符串和一个民族名称,格式为"工艺品名称 民族名称",中间用空格分隔。工艺品名称和民族名称均为不含空格的字符串。

输出格式:
每行输出一对配对,格式为"工艺品A(民族A) - 工艺品B(民族B)"。
所有配对按字符串字典序从小到大排序后输出。若不存在任何配对(如所有工艺品来自同一民族),则不输出任何内容。

示例输入:

4
刺绣 苗族
马头琴 蒙古族
芦笙 侗族
唐卡 藏族

示例输出:

刺绣(苗族) - 唐卡(藏族)
刺绣(苗族) - 芦笙(侗族)
刺绣(苗族) - 马头琴(蒙古族)
芦笙(侗族) - 唐卡(藏族)
马头琴(蒙古族) - 唐卡(藏族)
马头琴(蒙古族) - 芦笙(侗族)
说明:4件工艺品来自4个不同的民族,共有C(4,2)=6种配对。输出按字符串字典序排序,Unicode码点"刺"(U+523A) < "芦"(U+82A6) < "马"(U+9A6C)。
✅ 参考答案:
📖 参考代码
n = int(input())
crafts = []
for _ in range(n):
    line = input().split()
    name = line[0]
    ethnicity = line[1]
    crafts.append((name, ethnicity))
results = []
# 双层循环,j从i+1开始避免重复配对
for i in range(n):
    for j in range(i + 1, n):
        if crafts[i][1] != crafts[j][1]:  # 不同民族
            pair = f"{crafts[i][0]}({crafts[i][1]}) - {crafts[j][0]}({crafts[j][1]})"
            results.append(pair)
# 按字典序排序
results.sort()
for pair in results:
    print(pair)
第 12 题 编程操作题 15 分

题目描述:
苗族银饰工匠在设计新款银饰时,需要从若干种传统图案中选出恰好k种图案进行搭配。给定n种候选图案的名称,请你编写程序,输出所有可能的k种图案组合(不考虑图案的先后顺序,即"A B"和"B A"视为同一种组合)。

输入格式:
第一行输入两个整数n和k(2 ≤ k ≤ n ≤ 10),用空格分隔,表示候选图案数量和需要选取的数量。
第二行输入n个字符串(均为不含空格的图案名称),用空格分隔。

输出格式:
每行输出一种组合,图案名称之间用空格分隔。所有组合按字符串字典序从小到大排序后输出。

示例输入:

4 2
蝴蝶 龙凤 鱼纹 花卉

示例输出:

蝴蝶 花卉
蝴蝶 鱼纹
蝴蝶 龙凤
鱼纹 花卉
龙凤 花卉
龙凤 鱼纹
说明:从4种图案中选2种,共有C(4,2)=6种组合。输出按字典序排序,Unicode码点"蝴"(U+8774) < "鱼"(U+9C7C) < "龙"(U+9F99),因此蝴蝶开头的组合排在最前面。
✅ 参考答案:
📖 参考代码
from itertools import combinations
n, k = map(int, input().split())
patterns = input().split()
# 生成所有k个元素的组合
combs = list(combinations(patterns, k))
# 转换为字符串
result = [" ".join(c) for c in combs]
# 按字典序排序
result.sort()
for r in result:
    print(r)
第 13 题 编程操作题 20 分

题目描述:
藏族唐卡画师在创作时需要决定m种矿物颜料的着色顺序。不同的着色顺序会影响唐卡的最终效果。请编写程序,生成这m种颜料名称的所有排列(全排列),并将所有排列按字符串字典序排序后输出。

输入格式:
第一行输入一个整数m(2 ≤ m ≤ 6),表示颜料种类数量。
第二行输入m个字符串(均为不含空格的颜料名称),用空格分隔。

输出格式:
每行输出一种排列,颜料名称之间用空格分隔。输出行数等于m!(m的阶乘)。按整个排列字符串的字典序从小到大排序。

示例输入:

3
朱砂 石青 金粉

示例输出:

朱砂 石青 金粉
朱砂 金粉 石青
石青 朱砂 金粉
石青 金粉 朱砂
金粉 朱砂 石青
金粉 石青 朱砂
说明:3种颜料的全排列共3! = 6种。输出按字典序排序,Unicode码点"朱"(U+6731) < "石"(U+77F3) < "金"(U+91D1),因此"朱砂"开头的排列先输出,"金粉"开头的排列后输出。
✅ 参考答案:
📖 参考代码
from itertools import permutations
m = int(input())
colors = input().split()
# 生成所有排列
perms = list(permutations(colors))
# 转换为字符串列表
result = [" ".join(p) for p in perms]
# 按字典序排序
result.sort()
for r in result:
    print(r)
第 14 题 编程操作题 20 分

题目描述:
某民族文化研究中心建立了一个民族节日数据库,每个节日记录包含四个信息:所属民族、节日名称、举办月份(1-12)、持续天数。请编写程序完成以下四项多维度分析任务:
1. 统计每个民族各有多少个节日,按民族名称字典序升序输出;
2. 找出拥有节日数量最多的民族(可能有并列),输出其民族名称;
3. 统计1到12月每个月份各有多少个节日;
4. 将所有节日按持续天数从多到少排序后输出;若天数相同,按民族名称字典序升序排列。

输入格式:
第一行输入一个整数n(1 ≤ n ≤ 100),表示节日记录的数量。
接下来n行,每行输入四个数据,格式为"民族 节日名称 月份 天数",中间用空格分隔。月份为整数1-12,天数为正整数。

输出格式:
依次输出四个部分的结果:
第一行输出"一、各民族节日数量:"。
接下来每行输出一个民族及其节日数量,格式为"民族:数量个"(按民族名称字典序升序排列)。
空一行后,输出"二、节日最多的民族(X个):"(X为最大节日数量)。
接下来输出所有拥有最多节日的民族名称,多个民族之间用顿号(、)分隔,按字典序排列。
空一行后,输出"三、节日月份分布:"。
接下来每行输出格式为"X月:Y个"(X=1到12),共12行。
空一行后,输出"四、按持续天数排序(从多到少):"。
接下来每行输出一个节日,格式为"民族 节日名称 X月 Y天",按持续天数降序排列,天数相同按民族名称升序排列。

示例输入:

6
蒙古族 那达慕 7 5
彝族 火把节 6 3
藏族 雪顿节 8 7
傣族 泼水节 4 3
彝族 彝族年 11 7
苗族 苗年 10 15

示例输出:

一、各民族节日数量:
傣族:1个
彝族:2个
苗族:1个
蒙古族:1个
藏族:1个
二、节日最多的民族(2个):
彝族
三、节日月份分布:
1月:0个
2月:0个
3月:0个
4月:1个
5月:0个
6月:1个
7月:1个
8月:1个
9月:0个
10月:1个
11月:1个
12月:0个
四、按持续天数排序(从多到少):
苗族 苗年 10月 15天
彝族 彝族年 11月 7天
藏族 雪顿节 8月 7天
蒙古族 那达慕 7月 5天
傣族 泼水节 4月 3天
彝族 火把节 6月 3天
说明:彝族有2个节日(火把节和彝族年),数量最多;按天数排序时,苗年(15天)排第一;雪顿节和彝族年同为7天,按民族名称Unicode码点"彝"(U+5F5D) < "藏"(U+85CF),因此先输出彝族的彝族年再输出藏族的雪顿节;火把节和泼水节同为3天,"傣"(U+50A3) < "彝"(U+5F5D),因此先输出傣族的泼水节再输出彝族的火把节。
✅ 参考答案:
📖 参考代码
n = int(input())
records = []
for _ in range(n):
    parts = input().split()
    ethnicity = parts[0]
    name = parts[1]
    month = int(parts[2])
    days = int(parts[3])
    records.append((ethnicity, name, month, days))
# 1. 统计每个民族的节日数量
ethnicity_count = {}
for r in records:
    eth = r[0]
    ethnicity_count[eth] = ethnicity_count.get(eth, 0) + 1
print("一、各民族节日数量:")
for eth in sorted(ethnicity_count.keys()):
    print(f"{eth}:{ethnicity_count[eth]}个")
# 2. 找出节日数量最多的民族
max_count = max(ethnicity_count.values())
most = [eth for eth, cnt in ethnicity_count.items() if cnt == max_count]
most.sort()
print(f"\n二、节日最多的民族({max_count}个):")
print("、".join(most))
# 3. 统计节日月份分布
month_count = {}
for r in records:
    m = r[2]
    month_count[m] = month_count.get(m, 0) + 1
print("\n三、节日月份分布:")
for m in range(1, 13):
    cnt = month_count.get(m, 0)
    print(f"{m}月:{cnt}个")
# 4. 按持续天数排序
records_sorted = sorted(records, key=lambda x: (-x[3], x[0], x[1]))
print("\n四、按持续天数排序(从多到少):")
for r in records_sorted:
    print(f"{r[0]} {r[1]} {r[2]}月 {r[3]}天")