✏️ 习题
第 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 : 98138
猜年龄(维纳):年龄的立方是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}") # 1839
报数游戏: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}")
break43
计算分数的精确值:输入分子 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}")
第 1 / 5 页