🔒 答案已锁定

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

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

第 1 题 单选题 2 分
维吾尔族十二木卡姆是著名的大型古典音乐套曲。以下代码用列表推导式筛选出名称长度不少于3个字的木卡姆调式,输出结果中元素的个数是?
modes = ["拉克", "且比亚特", "木夏吾莱克", "恰尔尕", "潘吉尕",
         "乌孜哈勒", "艾介姆", "乌夏克", "巴雅特", "纳瓦", "西尕", "依拉克"]
result = [m for m in modes if len(m) >= 3]
print(len(result))
A. 7
B. 8
C. 9
D. 10
✅ 正确答案:C
💡 考点解析:列表推导式与条件筛选
第 2 题 单选题 2 分
壮族壮锦和苗族刺绣共享了一些传统纹样图案。以下代码中,集合操作的结果是?
zhuang = {"回纹", "云雷纹", "菱形纹", "水波纹"}
miao = {"蝴蝶纹", "云雷纹", "鱼纹", "回纹"}
common = zhuang & miao
print(common)
A. {"回纹", "云雷纹"}
B. {"菱形纹", "水波纹", "蝴蝶纹", "鱼纹"}
C. {"回纹", "云雷纹", "菱形纹", "水波纹", "蝴蝶纹", "鱼纹"}
D. {"回纹", "云雷纹", "蝴蝶纹", "鱼纹"}
✅ 正确答案:A
💡 考点解析:集合的交集运算(&运算符)
第 3 题 单选题 2 分
侗族鼓楼是侗寨的标志性建筑。以下代码定义了一个返回鼓楼信息的函数,输出结果是?
def drum_tower():
    name = "增冲鼓楼"
    floors = 13
    height = 25
    return name, floors, height
info = drum_tower()
print(info[1])
A. 增冲鼓楼
B. 13
C. ("增冲鼓楼", 13, 25)
D. 报错
✅ 正确答案:B
💡 考点解析:函数多返回值(返回元组)及索引访问
第 4 题 单选题 2 分
土家族摆手舞的数学建模中需要计算平方根。以下代码的输出结果是?
from math import sqrt as sq
print(sq(25))
A. 5
B. 5.0
C. 报错(模块导入方式错误)
D. sqrt(25)
✅ 正确答案:B
💡 考点解析:模块导入方式(from...import...as 别名)
第 5 题 单选题 2 分
蒙古族传统文字使用回鹘式蒙古文。以下代码利用字符编码函数进行字母变换,输出结果是?
print(chr(ord('A') + 2))
A. A
B. B
C. C
D. 报错
✅ 正确答案:C
💡 考点解析:字符编码函数 ord() 与 chr() 的配合使用
第 6 题 多选题 4 分
以下列表存储了维吾尔族几种传统舞蹈的名称。关于列表的常用方法,以下哪些说法是正确的?
dances = ["赛乃姆", "刀郎舞", "萨玛舞", "纳孜尔库姆", "赛乃姆"]
A. dances.pop() 执行后会删除并返回列表中最后一个元素 "赛乃姆"
B. dances.remove("赛乃姆") 执行后只删除第一个出现的 "赛乃姆",列表中还有一个 "赛乃姆"
C. dances.count("赛乃姆") 的返回值是 2
D. dances.clear() 执行后列表变为空列表 []
✅ 正确答案:ABCD
💡 考点解析:列表常用方法(pop、remove、count、clear)
第 7 题 多选题 4 分
定义一个记录民族节日信息的函数,以下关于函数参数的说法,哪些是正确的?
def festival(name, month, *activities, **details):
    pass
A. name 和 month 是必须的位置参数,调用时必须提供
B. *activities 可以接收任意数量的位置参数,并将它们打包成一个元组
C. **details 可以接收任意数量的关键字参数,并将它们打包成一个字典
D. 调用 festival("泼水节", 4, "赛龙舟", "放高升", location="西双版纳") 是合法的
✅ 正确答案:ABCD
💡 考点解析:函数参数类型(位置参数、可变位置参数*args、可变关键字参数**kwargs)
第 8 题 多选题 4 分
集合A和集合B分别存储了两组民族乐器的名称。以下关于集合运算的说法,哪些是正确的?
A = {"芦笙", "铜鼓", "马头琴", "琵琶"}
B = {"琵琶", "古筝", "铜鼓", "二胡"}
A. A & B 的结果是 {"琵琶", "铜鼓"},表示两个集合的交集
B. A | B 的结果是 {"芦笙", "铜鼓", "马头琴", "琵琶", "古筝", "二胡"},表示两个集合的并集
C. A - B 的结果是 {"芦笙", "马头琴"},表示属于A但不属于B的元素(差集)
D. A ^ B 的结果是 {"芦笙", "马头琴", "古筝", "二胡"},表示两个集合的对称差集
✅ 正确答案:ABCD
💡 考点解析:集合运算(交集&、并集|、差集-、对称差集^)
第 9 题 多选题 4 分
在验证民族工艺品编号的程序中,需要用到字符串的判断方法。以下关于字符串判断方法的说法,哪些是正确的?
s1 = "苗绣图案"
s2 = "MiaoXiu2024"
A. s1.startswith("苗绣") 的结果是 True
B. s1.endswith("图案") 的结果是 True
C. s2.isalnum() 的结果是 True(所有字符均为字母或数字,没有空格或特殊符号)
D. s2.isalpha() 的结果是 False(因为字符串中包含数字)
✅ 正确答案:ABCD
💡 考点解析:字符串判断方法(startswith、endswith、isalnum、isalpha)
第 10 题 多选题 4 分
以下二维列表中,每行记录了一个省区名称、主要民族和人口数量(万人)。关于二维列表的基本操作,以下哪些说法是正确的?
data = [
    ["广西", "壮族", 1692],
    ["湖南", "苗族", 202],
    ["贵州", "苗族", 397],
    ["西藏", "藏族", 628]
]
A. data[0] 的结果是 ["广西", "壮族", 1692],表示二维列表的第0行
B. data[1][2] 的结果是 202,表示第1行第2列的元素
C. len(data) 的结果是 4,表示二维列表共有4行
D. data[2][1] 的结果是 "苗族",表示第2行第1列的元素
✅ 正确答案:ABCD
💡 考点解析:二维列表的定义及索引访问
第 11 题 编程操作题 15 分

题目描述:
维吾尔族十二木卡姆是享誉世界的非物质文化遗产。每部木卡姆套曲有名称和总演奏时长(分钟)。请编写程序,输入n部木卡姆的信息,按照以下规则排序后输出:
1. 按演奏时长从长到短(降序)排列
2. 若演奏时长相同,则按名称的字符串默认顺序(升序)排列

输入格式:
第一行输入一个整数n(1 ≤ n ≤ 100),表示木卡姆的数量。
接下来n行,每行输入一个字符串和一个整数,格式为"名称,时长",中间用英文逗号分隔。时长范围为1~300。

输出格式:
输出n行,每行格式为"名称:时长分钟",按排序规则排列。

示例输入:

4
拉克木卡姆,120
且比亚特木卡姆,90
木夏吾莱克木卡姆,150
恰尔尕木卡姆,90

示例输出:

木夏吾莱克木卡姆:150分钟
拉克木卡姆:120分钟
且比亚特木卡姆:90分钟
恰尔尕木卡姆:90分钟
说明:木夏吾莱克木卡姆时长150最长排第一;拉克木卡姆时长120排第二;且比亚特和恰尔尕时长相同(90),按名称升序,"且比亚特"的拼音首字母'Q'在"恰尔尕"的拼音首字母'Q'... 按字符串默认升序排列,"且比亚特木卡姆" < "恰尔尕木卡姆"。
✅ 参考答案:
📖 参考代码
n = int(input())
muqam_list = []
for i in range(n):
    line = input().strip()
    name, duration = line.split(",")
    muqam_list.append([name, int(duration)])
# 按时长降序(-x[1]),时长相同按名称升序(x[0])
muqam_list.sort(key=lambda x: (-x[1], x[0]))
for name, duration in muqam_list:
    print(f"{name}:{duration}分钟")
第 12 题 编程操作题 15 分

题目描述:
藏族雪顿节是藏区重要的传统节日,起源于公元11世纪。假设雪顿节在每年公历的第d天举行(d从1开始计算,即1月1日是第1天)。给定一个整数d,请编写程序计算出雪顿节所在的公历月份和日期。
假设该年为非闰年:1月31天,2月28天,3月31天,4月30天,5月31天,6月30天,7月31天,8月31天,9月30天,10月31天,11月30天,12月31天。

输入格式:
输入一个整数d(1 ≤ d ≤ 365),表示一年中的第d天。

输出格式:
输出格式为"M月D日",其中M和D均为整数,不含前导零。
示例输入1:
45
示例输出1:
2月14日
说明:1月有31天,45 - 31 = 14,所以是2月14日。
示例输入2:
200
示例输出2:
7月19日
说明:1月(31)→2月(28)→3月(31)→4月(30)→5月(31)→6月(30) = 181天,200-181=19,所以是7月19日。

示例输入:

示例输出:

✅ 参考答案:
📖 参考代码
d = int(input())
# 非闰年每月天数
month_days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
remaining = d
month = 0
for i in range(12):
    if remaining <= month_days[i]:
        month = i + 1
        day = remaining
        break
    remaining -= month_days[i]
print(f"{month}月{day}日")
第 13 题 编程操作题 20 分

题目描述:
某苗族银饰博物馆将藏品信息保存在文本文件 silverware.txt 中,每行记录一件藏品的编号、名称、类型和重量(克),格式为"藏品编号,名称,类型,重量"。请编写程序完成以下功能:
1. 读取文件中的所有银饰藏品信息
2. 输入一个银饰类型(如"头饰"或"项圈"或"手镯"),筛选出该类型的所有藏品
3. 按照重量从大到小排序输出藏品信息
4. 计算并输出该类型藏品的总重量
5. 若该类型不存在任何藏品,输出"未找到该类型的藏品"
6. 若文件不存在,输出"文件读取失败"

输入格式:
第一行输入文件名(如 silverware.txt)。
第二行输入要查询的银饰类型(字符串)。
silverware.txt 文件示例内容:
M001,银角头饰,头饰,350
M002,银项圈,项圈,280
M003,银手镯,手镯,120
M004,银梳,头饰,85
M005,银耳环,耳饰,30
M006,银压领,项圈,200
M007,银发簪,头饰,45

输出格式:
第一行输出"X类藏品:"(X为查询的类型)。
接下来每行输出一件藏品的信息,格式为"名称 重量克"(名称和重量之间用空格分隔),按重量从大到小排列。
最后输出"总重量:Y克"(Y为总重量)。
若该类型不存在,则输出"未找到该类型的藏品"。

示例输入:

silverware.txt
头饰

示例输出:

头饰类藏品:
银角头饰 350克
银梳 85克
银发簪 45克
总重量:480克
✅ 参考答案:
📖 参考代码
filename = input().strip()
query_type = input().strip()
try:
    with open(filename, "r", encoding="utf-8") as f:
        lines = f.readlines()
    # 存储该类型的藏品信息
    items = []
    total_weight = 0
    for line in lines:
        line = line.strip()
        if line == "":
            continue
        parts = line.split(",")
        if len(parts) == 4:
            code = parts[0]
            name = parts[1]
            item_type = parts[2]
            weight = int(parts[3])
            if item_type == query_type:
                items.append((name, weight))
                total_weight += weight
    if len(items) == 0:
        print("未找到该类型的藏品")
    else:
        # 按重量降序排序
        items.sort(key=lambda x: -x[1])
        print(f"{query_type}类藏品:")
        for name, weight in items:
            print(f"{name} {weight}克")
        print(f"总重量:{total_weight}克")
except FileNotFoundError:
    print("文件读取失败")
第 14 题 编程操作题 20 分

题目描述:
中华民族乐器数据库中,每件乐器有一个统一编码,格式为:民族代码-类别号-序号。编码规则如下:
- 民族代码:2位大写英文字母(如 MG 表示蒙古族、ZG 表示藏族、ZW 表示壮族、MZ 表示苗族)
- 类别号:1位数字(1表示弦鸣乐器、2表示气鸣乐器、3表示体鸣乐器、4表示膜鸣乐器)
- 序号:3位或4位数字
例如,MG-1-015 表示蒙古族弦鸣乐器,序号为015;ZW-3-1024 表示壮族体鸣乐器,序号为1024。
请编写程序,输入一个乐器编码字符串,验证其是否符合上述格式要求,并输出验证结果。
验证规则:
1. 总长度必须为8或9个字符(含两个连字符)
2. 前2个字符必须全部是大写英文字母
3. 第3个字符必须是连字符 -
4. 第4个字符必须是数字 1、2、3 或 4
5. 第5个字符必须是连字符 -
6. 剩余部分(第6个字符到末尾)必须是3位或4位纯数字

输入格式:
输入一行字符串,表示待验证的乐器编码。

输出格式:
若编码合法,输出"编码合法"。
若编码不合法,输出"编码不合法"。
示例输入1:
MG-1-015
示例输出1:
编码合法
示例输入2:
abc-1-xyz
示例输出2:
编码不合法
示例输入3:
ZW-3-1024
示例输出3:
编码合法
示例输入4:
MZ-5-001
示例输出4:
编码不合法
说明:示例4中类别号为5,不在1-4范围内,因此不合法。

示例输入:

示例输出:

✅ 参考答案:
📖 参考代码
code = input().strip()
# 验证规则
valid = True
# 规则1:总长度
if len(code) != 8 and len(code) != 9:
    valid = False
# 规则2:前2个字符必须是大写字母
if valid and not (code[0].isupper() and code[1].isupper()):
    valid = False
# 规则3:第3个字符必须是'-'
if valid and code[2] != '-':
    valid = False
# 规则4:第4个字符必须是'1'~'4'
if valid and code[3] not in "1234":
    valid = False
# 规则5:第5个字符必须是'-'
if valid and code[4] != '-':
    valid = False
# 规则6:剩余部分是3-4位纯数字
if valid:
    suffix = code[5:]
    if len(suffix) < 3 or len(suffix) > 4:
        valid = False
    elif not suffix.isdigit():
        valid = False
if valid:
    print("编码合法")
else:
    print("编码不合法")