✏️ 习题

第 5 章 · 序列 · 共 45 题 · 分 5 页 · 由易到难

答案默认折叠,点击题目或右侧开关控制显示
展开所有答案
1
输入一个字符串,将其逆序输出。
📝 样例输入: hello
▶ 运行结果: 请输入字符串:hello olleh
参考答案
python
s = input("请输入字符串:")
print(s[::-1])
2
输入 18 位身份证号码,提取出生日期和性别。第 7-14 位为出生日期,第 17 位奇数为男、偶数为女。
📝 样例输入: 110105200001011234
▶ 运行结果: 请输入18位身份证号码:110105200001011234 出生日期:2000年01月01日 性别:男性
参考答案
python
id_card = input("请输入18位身份证号码:")
year = id_card[6:10]
month = id_card[10:12]
day = id_card[12:14]
sex = "男性" if int(id_card[16]) % 2 == 1 else "女性"
print(f"出生日期:{year}年{month}月{day}日")
print(f"性别:{sex}")
3
将输入的字符串加密,规则:字母替换为其后第 6 个字符(如 a→g, x→d, y→e, z→f),非字母字符不变。
📝 样例输入: Hello
▶ 运行结果: 请输入原始字符串:Hello 加密后: Nkrru
参考答案
python
s = input("请输入原始字符串:")
result = ""
for ch in s:
    if "a" <= ch <= "z":
        t = ord(ch) + 6
        if t > ord('z'):
            t -= 26
        result += chr(t)
    elif "A" <= ch <= "Z":
        t = ord(ch) + 6
        if t > ord('z'):
            t -= 26
        result += chr(t)
    else:
        result += ch
print("加密后:", result)
4
编写函数 reverse_words(s),接收一个英文句子,反转其中单词的顺序。
📝 样例输入: the sky is blue
▶ 运行结果: 请输入一句英文:the sky is blue blue is sky the
参考答案
python
def reverse_words(s):
    words = s.strip().split()
    words = words[::-1]
    return ' '.join(words)

text = input("请输入一句英文:")
print(reverse_words(text))
5
给定字符串列表,按字符串长度从小到大排序输出。
▶ 运行结果: ['a', 'hi', 'code', 'apple', 'python', 'hello world']
参考答案
python
lst = ["apple", "hi", "python", "a", "hello world", "code"]
result = sorted(lst, key=len)
print(result)
# 从大到小:sorted(lst, key=len, reverse=True)
6
购物清单:创建空列表,依次添加"牛奶""面包""苹果""鸡蛋",删除"苹果",末尾添加"香蕉",打印最终清单。
▶ 运行结果: 1. 牛奶 2. 面包 3. 鸡蛋 4. 香蕉
参考答案
python
shopping = []
shopping.append("牛奶")
shopping.append("面包")
shopping.append("苹果")
shopping.append("鸡蛋")
shopping.remove("苹果")
shopping.append("香蕉")
for i, item in enumerate(shopping, 1):
    print(f"{i}. {item}")
7
成绩统计:给定 scores = [85, 92, 78, 63, 95, 88, 72, 56, 90, 81],计算平均分(保留1位小数)、最高分、最低分、不及格人数、90分以上成绩列表。
▶ 运行结果: 平均分:80.0 最高分:95 最低分:56 不及格:1人 90分以上:[92, 95, 90]
参考答案
python
scores = [85, 92, 78, 63, 95, 88, 72, 56, 90, 81]
print(f"平均分:{sum(scores)/len(scores):.1f}")
print(f"最高分:{max(scores)}  最低分:{min(scores)}")
fail = sum(1 for s in scores if s < 60)
print(f"不及格:{fail}人")
high = [s for s in scores if s >= 90]
print(f"90分以上:{high}")
8
名字排序:将 names = ["Zhang Wei","Li Na","Wang Fang","Chen Ming"] 按字母正序和反序排序,用切片输出前2名和后2名。
▶ 运行结果: 正序:['Chen Ming', 'Li Na', 'Wang Fang', 'Zhang Wei'] 反序:['Zhang Wei', 'Wang Fang', 'Li Na', 'Chen Ming'] 前2名:['Chen Ming', 'Li Na'] 后2名:['Wang Fang', 'Zhang Wei']
参考答案
python
names = ["Zhang Wei", "Li Na", "Wang Fang", "Chen Ming"]
asc = sorted(names)
desc = sorted(names, reverse=True)
print(f"正序:{asc}")
print(f"反序:{desc}")
print(f"前2名:{asc[:2]}")
print(f"后2名:{asc[-2:]}")
9
统计列表中各元素出现的频率,返回字典。
▶ 运行结果: {'c': 1, 'b': 2, 'a': 3}
参考答案
python
lst = ['a', 'b', 'a', 'c', 'b', 'a']
freq = {x: lst.count(x) for x in set(lst)}
print(freq)  # {'a': 3, 'b': 2, 'c': 1}
10
编写函数 group_list(lst, size),将列表按指定大小分组,返回嵌套列表。
▶ 运行结果: [[10, 20, 30], [40, 50, 60], [70]]
参考答案
python
def group_list(lst, size):
    return [lst[i:i+size] for i in range(0, len(lst), size)]

lst = [10, 20, 30, 40, 50, 60, 70]
print(group_list(lst, 3))
11
有已排序列表 a=[1,4,6,9,13,16,19,28,40,100],输入一个数,按原规律插入并保持有序。
📝 样例输入: 25
▶ 运行结果: 请输入要插入的数字:25 [1, 4, 6, 9, 13, 16, 19, 25, 28, 40, 100]
参考答案
python
a = [1, 4, 6, 9, 13, 16, 19, 28, 40, 100]
num = int(input("请输入要插入的数字:"))
a.append(num)
a.sort()
print(a)
12
将列表 [1,9,7,4,2,6,5,8] 排序,使偶数在前、奇数在后。
▶ 运行结果: [4, 2, 6, 8, 1, 9, 7, 5]
参考答案
python
lst = [1, 9, 7, 4, 2, 6, 5, 8]
evens = [x for x in lst if x % 2 == 0]
odds = [x for x in lst if x % 2 != 0]
result = evens + odds
print(result)  # [4, 2, 6, 8, 1, 9, 7, 5]
13
在列表之间移动元素:将 list1 中所有元素逐个弹出(pop),转换为大写后追加到 list2。
▶ 运行结果: ['CC', 'BB', 'AA']
参考答案
python
list1 = ['aa', 'bb', 'cc']
list2 = []
while list1:
    cur = list1.pop()
    list2.append(cur.upper())
print(list2)  # ['CC', 'BB', 'AA']
14
使用列表生成斐波那契数列前 10 项。
▶ 运行结果: [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
参考答案
python
fib = [0, 1]
for i in range(2, 10):
    fib.append(fib[i-1] + fib[i-2])
print(fib)  # [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
15
列表 [3,6,9,0,5,8] 转为元组,输出后半部分。再输入数字 n,若不在元组中则复制3份添加到末尾,输出元组长度。
📝 样例输入: 7
▶ 运行结果: 请输入数字 n:7 (0, 5, 8) 9
参考答案
python
t = tuple([3, 6, 9, 0, 5, 8])
n = int(input("请输入数字 n:"))
half = len(t) // 2
print(t[half:])  # (0, 5, 8)
if n not in t:
    t = t + (n,) * 3
print(len(t))
16
实现选择排序:每次从未排序部分找到最小值放到已排序末尾。
▶ 运行结果: [20, 26, 30, 90, 91, 93, 98]
参考答案
python
lst = [91, 30, 93, 98, 26, 20, 90]
n = len(lst)
for i in range(n - 1):
    min_idx = i
    for j in range(i + 1, n):
        if lst[j] < lst[min_idx]:
            min_idx = j
    lst[i], lst[min_idx] = lst[min_idx], lst[i]
print(lst)
17
输入一个字符串,按字母首次出现的顺序,依次打印每个字母及其出现次数。
📝 样例输入: hello
▶ 运行结果: 请输入一个单词:hello h 1 e 1 l 2 o 1
参考答案
python
s = input("请输入一个单词:")
count = {}
for ch in s:
    count[ch] = count.get(ch, 0) + 1
for ch in s:
    if ch in count:
        print(f"{ch} {count[ch]}")
        del count[ch]
18
单词分析:输入一个字符串,找出出现最多的字母及其次数。
📝 样例输入: helloworld
▶ 运行结果: 请输入字符串:helloworld l 3
参考答案
python
s = input("请输入字符串:").lower()
d = {}
for ch in s:
    d[ch] = d.get(ch, 0) + 1
max_key = max(d, key=d.get)
print(max_key)
print(d[max_key])
19
词频统计:输入 n 个单词(忽略大小写),输出出现次数最多的单词。
📝 样例输入: 3 apple banana apple
▶ 运行结果: 单词个数:3 apple banana apple 出现最多: apple
参考答案
python
n = int(input("单词个数:"))
cnt = {}
for _ in range(n):
    word = input().lower()
    cnt[word] = cnt.get(word, 0) + 1
ans = max(cnt, key=cnt.get)
print("出现最多:", ans)
20
字典基本操作:输入数学、语文、英语成绩构建字典,用 update() 添加物理和生物,数学加4分,删除生物并获取其成绩,输出结果。
📝 样例输入: 85 90 78
▶ 运行结果: 请输入数学 语文 英语成绩(空格分隔):85 90 78 生物成绩是88分,数学成绩是89分
参考答案
python
scores = input("请输入数学 语文 英语成绩(空格分隔):").split()
d = {'数学': int(scores[0]), '语文': int(scores[1]), '英语': int(scores[2])}
d.update({'物理': 95, '生物': 88})
d['数学'] += 4
v = d.pop('生物')
print(f"生物成绩是{v}分,数学成绩是{d['数学']}分")
21
水果店查询:两个列表 fruit=['苹果','香蕉','草莓','橙子','芒果','葡萄','蓝莓']number=[1,3,5,6,13,21,10],组成字典后查询水果数量,不存在返回0。
📝 样例输入: 苹果
▶ 运行结果: 请输入水果名称:苹果 1
参考答案
python
fruit = ['苹果','香蕉','草莓','橙子','芒果','葡萄','蓝莓']
number = [1, 3, 5, 6, 13, 21, 10]
inv = dict(zip(fruit, number))
query = input("请输入水果名称:").strip()
print(inv.get(query, 0))
22
域名过滤:从邮件列表中筛选出属于指定域名的邮件地址。
📝 样例输入: example.com
▶ 运行结果: 请输入域名:example.com ['user1@example.com', 'guest@example.com']
参考答案
python
emails = ["user1@example.com", "user2@sample.org",
           "admin@sample.org", "guest@example.com"]
domain = input("请输入域名:")
result = [e for e in emails if e.endswith(f"@{domain}")]
print(result)
23
用户名提取与统计:从邮件地址列表中统计不同用户名的数量。
📝 样例输入: alice@x.com,bob@y.com,alice@z.com
▶ 运行结果: 请输入邮件地址(逗号分隔):alice@x.com,bob@y.com,alice@z.com 2
参考答案
python
emails = input("请输入邮件地址(逗号分隔):").split(',')
usernames = {e.split('@')[0] for e in emails}
print(len(usernames))
24
学生成绩管理系统:用列表+字典存储5个学生信息(姓名/语文/数学/英语),打印每人总分、找出最高分学生、统计三科都及格的人数。
▶ 运行结果: 张三 总分:265 李四 总分:223 王五 总分:277 最高分:王五 三科都及格:3人
参考答案
python
students = [
    {"姓名": "张三", "语文": 88, "数学": 92, "英语": 85},
    {"姓名": "李四", "语文": 75, "数学": 68, "英语": 80},
    {"姓名": "王五", "语文": 95, "数学": 89, "英语": 93},
]
for s in students:
    total = s["语文"] + s["数学"] + s["英语"]
    print(f'{s["姓名"]} 总分:{total}')
top = max(students, key=lambda s: s["语文"]+s["数学"]+s["英语"])
print(f'最高分:{top["姓名"]}')
all_pass = [s for s in students
            if s["语文"]>=60 and s["数学"]>=60 and s["英语"]>=60]
print(f'三科都及格:{len(all_pass)}人')
25
判断 IP 地址合法性:用三个点隔开的四个数字,每个数字 0~255。
📝 样例输入: 192.168.1.1
▶ 运行结果: 请输入IP地址:192.168.1.1 合法
参考答案
python
ip = input("请输入IP地址:")
parts = ip.split('.')
if len(parts) == 4:
    valid = all(p.isdigit() and 0 <= int(p) <= 255 for p in parts)
    print("合法" if valid else "不合法")
else:
    print("不合法")
26
判断给定字符串是否是 Python 合法标识符(首字符为字母或下划线,后续为字母/数字/下划线,不能是关键字)。
📝 样例输入: my_var
▶ 运行结果: 请输入字符串:my_var 合法
参考答案
python
import keyword
s = input("请输入字符串:")
if not s or ' ' in s or keyword.iskeyword(s):
    print("非法")
elif not (s[0].isalpha() or s[0] == '_'):
    print("非法")
elif not all(c.isalnum() or c == '_' for c in s[1:]):
    print("非法")
else:
    print("合法")
27
密码注册验证:密码长度6~12,只能包含字母/数字/!@#$,且大写、小写、数字至少含两种,且至少含一个特殊字符。
📝 样例输入: Abc123!
▶ 运行结果: 请输入密码:Abc123! 合规
参考答案
python
def is_valid(pwd):
    if len(pwd) < 6 or len(pwd) > 12:
        return False
    allowed = set("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$")
    if not all(c in allowed for c in pwd):
        return False
    types = sum([any(c.isupper() for c in pwd),
                 any(c.islower() for c in pwd),
                 any(c.isdigit() for c in pwd)])
    if types < 2:
        return False
    if not any(c in "!@#$" for c in pwd):
        return False
    return True

pwd = input("请输入密码:")
print("合规" if is_valid(pwd) else "不合规")
28
手机号马赛克:输入 11 位手机号,将中间 4 位替换为 ****
📝 样例输入: 13812345678
▶ 运行结果: 请输入11位手机号:13812345678 138****5678
参考答案
python
phone = input("请输入11位手机号:")
masked = phone[:3] + "****" + phone[7:]
print(masked)
29
最长连号的长度:输入 n 个正整数,找出序列中最长连续递增(每次+1)的长度。
📝 样例输入: 7 1 2 3 4 5 6 7
▶ 运行结果: 请输入 n:7 请输入 n 个正整数:1 2 3 4 5 6 7 最长连号长度:7
参考答案
python
n = int(input("请输入 n:"))
nums = list(map(int, input("请输入 n 个正整数:").split()))
cur, mx = 1, 1
for i in range(1, n):
    if nums[i] == nums[i-1] + 1:
        cur += 1
        mx = max(mx, cur)
    else:
        cur = 1
print(f"最长连号长度:{mx}")
30
最长公共前缀:给定字符串数组,找出所有字符串的最长公共前缀。
▶ 运行结果: 最长公共前缀:"abc"
参考答案
python
strs = ["abca", "abc", "abca", "abc", "abcc"]
if not strs:
    print("")
else:
    prefix = strs[0]
    for s in strs[1:]:
        while not s.startswith(prefix):
            prefix = prefix[:-1]
    print(f'最长公共前缀:"{prefix}"')
31
判断字符是否唯一:给定一个字符串,判断其中每个字符是否全不同。
📝 样例输入: hello
▶ 运行结果: 请输入字符串:hello 有重复
参考答案
python
s = input("请输入字符串:")
print("全不同" if len(set(s)) == len(s) else "有重复")
32
字符串变形:将字符串中空格隔开的单词反序,同时反转每个字符的大小写。
📝 样例输入: Hello World
▶ 运行结果: 请输入字符串:Hello World wORLD hELLO
参考答案
python
s = input("请输入字符串:")
words = s.split()[::-1]
result = ' '.join(w.swapcase() for w in words)
print(result)
33
压缩字符串:利用字符重复次数压缩,如 "aabcccccaaa" → "a2b1c5a3"。单个字符不写1。
📝 样例输入: aabcccccaaa
▶ 运行结果: 请输入字符串:aabcccccaaa a2bc5a3
参考答案
python
s = input("请输入字符串:")
result = ""
i = 0
while i < len(s):
    count = 1
    while i + 1 < len(s) and s[i] == s[i+1]:
        count += 1
        i += 1
    result += s[i]
    if count > 1:
        result += str(count)
    i += 1
print(result)
34
删除字符:从字符串 str 中完全删除在 sub 中存在的字符。
📝 样例输入: hello world lo
▶ 运行结果: 请输入字符串 str:hello world 请输入要删除的字符 sub:lo he wrd
参考答案
python
s = input("请输入字符串 str:")
sub = input("请输入要删除的字符 sub:")
result = ''.join(ch for ch in s if ch not in sub)
print(result)
35
目标移动:给定数组 nums 和目标值 target,将所有等于 target 的元素移到数组前面,其他元素相对顺序不变。
▶ 运行结果: [3, 3, 3, 1, 2, 4, 5]
参考答案
python
nums = [1, 3, 2, 3, 4, 3, 5]
target = 3
matched = [x for x in nums if x == target]
others = [x for x in nums if x != target]
result = matched + others
print(result)  # [3, 3, 3, 1, 2, 4, 5]
36
元组排序:输入多个 (name, age, score) 元组,按 name > age > score 优先级排序。
▶ 运行结果: ('John', 20, 90) ('Jony', 17, 91) ('Jony', 17, 93) ('Tom', 19, 80)
参考答案
python
data = [("Tom",19,80), ("John",20,90), ("Jony",17,91), ("Jony",17,93)]
result = sorted(data, key=lambda x: (x[0], x[1], x[2]))
for item in result:
    print(item)
37
将 1~9 分成3组,组成3个三位数,使比例为 1:2:3。求所有满足条件的组合。
▶ 运行结果: 192 : 384 : 576 219 : 438 : 657 273 : 546 : 819 327 : 654 : 981
参考答案
python
for x in range(100, 334):
    y, z = 2 * x, 3 * x
    digits = str(x) + str(y) + str(z)
    if '0' not in digits and len(set(digits)) == 9:
        print(f"{x} : {y} : {z}")
# 192 : 384 : 576
# 219 : 438 : 657
# 273 : 546 : 819
# 327 : 654 : 981
38
猜年龄(维纳):年龄的立方是4位数,4次方是6位数,这10个数字恰好包含0~9各一次。求年龄。
▶ 运行结果: 年龄:18
参考答案
python
for i in range(10, 30):
    i3, i4 = str(i ** 3), str(i ** 4)
    if len(i3) == 4 and len(i4) == 6:
        if len(set(i3 + i4)) == 10:
            print(f"年龄:{i}")  # 18
39
报数游戏:n 个人围成一圈,从第1人开始报数,报到3的人退出。牛牛站在第 m 个位置,他是第几个退出的?
📝 样例输入: 10 5
▶ 运行结果: 总人数:10 牛牛的位置:5 8
参考答案
python
n = int(input("总人数:"))
m = int(input("牛牛的位置:"))
people = list(range(1, n + 1))
count = 0
index = 0
while people:
    index = (index + 2) % len(people)
    count += 1
    if people[index] == m:
        print(count)
        break
    people.pop(index)
40
约瑟夫环:n 人围成一圈,从第1人报数,每数到 k 淘汰,直到剩 r 人。输出淘汰顺序和幸存者。
📝 样例输入: 10 3 5
▶ 运行结果: 总人数 n:10 淘汰数 k:3 剩余人数 r:5 淘汰:3 淘汰:6 淘汰:9 淘汰:2 淘汰:7 幸存者:[1, 4, 5, 8, 10]
参考答案
python
n = int(input("总人数 n:"))
k = int(input("淘汰数 k:"))
r = int(input("剩余人数 r:"))
people = list(range(1, n + 1))
index = 0
while len(people) > r:
    index = (index + k - 1) % len(people)
    print(f"淘汰:{people.pop(index)}")
print(f"幸存者:{people}")
41
猜牌术:13 张黑桃预先排好,从最上面数,第1次翻第1张是A,第2次数1~2翻第2张是2……求原始排列。
▶ 运行结果: [1, 8, 2, 5, 10, 3, 12, 11, 9, 4, 7, 6, 13]
参考答案
python
cards = [0] * 13
pos = 0
for i in range(1, 14):  # i = 牌面数字
    count = 0
    while count < i:
        if cards[pos % 13] == 0:
            count += 1
            if count == i:
                cards[pos % 13] = i
        pos += 1
print(cards)
42
求车速:里程表读数 95859(对称数),2小时后出现新对称数(仍为5位数)。求车速和新对称数。
▶ 运行结果: 新对称数:95959,车速:50.00
参考答案
python
for i in range(95860, 100000):
    s = str(i)
    if s == s[::-1]:  # 回文判断
        speed = (i - 95859) / 2
        print(f"新对称数:{i},车速:{speed:.2f}")
        break
43
计算分数的精确值:输入分子 M 和分母 N,计算 M/N 的值。若为无限循环小数,输出第一循环节及起止位置。
📝 样例输入: 1 7
▶ 运行结果: 分子:1 分母:7 0.142857(循环节从第1位开始)
参考答案
python
m = int(input("分子:"))
n = int(input("分母:"))
remainder = {}  # 余数 -> 位置
result = "0."
pos = 0
while m != 0:
    if m in remainder:
        start = remainder[m]
        print(f"{result}(循环节从第{start+1}位开始)")
        break
    remainder[m] = pos
    m *= 10
    result += str(m // n)
    m %= n
    pos += 1
else:
    print(result)
44
人民币小写转大写:输入人民币小写数值,输出汉字大写形式。
📝 样例输入: 10234567.89
▶ 运行结果: 请输入金额:10234567.89 壹仟零贰拾叁万肆仟伍佰陆拾柒元捌角玖分
参考答案
python
num = input("请输入金额:")
int_part, dec_part = num.split('.') if '.' in num else (num, '00')
dec_part = dec_part.ljust(2, '0')[:2]
digits = '零壹贰叁肆伍陆柒捌玖'
units = ['', '拾', '佰', '仟', '万', '拾', '佰', '仟', '亿']

result = ''
for i, d in enumerate(int_part[::-1]):
    if d != '0':
        result = digits[int(d)] + units[i] + result
    elif not result.startswith('零'):
        result = '零' + result
result = result.rstrip('零') + '元'

if dec_part[0] != '0':
    result += digits[int(dec_part[0])] + '角'
if dec_part[1] != '0':
    result += digits[int(dec_part[1])] + '分'
print(result)
45
输入一行字符,分别统计英文字母、空格、数字和其它字符的个数。
📝 样例输入: Hello World 123!
▶ 运行结果: 请输入一行字符:Hello World 123! 字母:10,空格:2,数字:3,其它:1
参考答案
python
s = input("请输入一行字符:")
letters = sum(1 for c in s if c.isalpha())
spaces = sum(1 for c in s if c.isspace())
digits = sum(1 for c in s if c.isdigit())
others = len(s) - letters - spaces - digits
print(f"字母:{letters},空格:{spaces},数字:{digits},其它:{others}")