Python 练习讲解 · 03 / 25

列表处理:逐步读取、筛选与排序

用普通循环逐个读数、筛选偶数、计算平方并排序。

要学习的知识点

题目

练习 3:筛选整数列表中的偶数,将它们平方后升序输出。

输入:第一行 n,第二行 n 个整数(空格分隔)。

参考程序:ex03.py;空白练习:lx03.py。

完整代码

以下内容与 ex03.py 一致,可对照右侧讲解阅读。

"""练习 3:筛选整数列表中的偶数,将它们平方后升序输出。
输入:第一行 n,第二行 n 个整数(空格分隔)。

学习说明:
- int(input()) 读入元素个数;split() 把第二行拆成数字文本。
- for 循环逐个把数字文本转为整数,再用 append() 放进列表。
- 再用一个 for 循环检查偶数;符合条件时计算平方并保存到新列表。
- list.sort() 把平方列表升序排列;最后逐个打印列表中的数。
"""
n = int(input())
number_texts = input().split()
values = []

for index in range(n):
	number_text = number_texts[index]
	value = int(number_text)
	values.append(value)

squares = []
for value in values:
	if value % 2 == 0:
		square = value * value
		squares.append(square)

squares.sort()

for square in squares:
	print(square)

进阶写法

这版与初学版解决同一道题,写法更精炼。先读代码,再看下面的简要说明。

进阶源码文件:ex03_adv.py

"""练习 3 进阶版:用 map 转换输入,并用列表解析筛选、平方和排序。"""
n = int(input())
values = list(map(int, input().split()))

squares = sorted([value * value for value in values[:n] if value % 2 == 0])
print(*squares)

map(int, ...) 把 int 函数逐项应用到输入文本;list() 将结果保存为列表。列表解析可按“结果 for 元素 in 列表 if 条件”理解,sorted() 返回新排序列表;print(*squares) 将列表拆成多个参数,以空格输出。

运行结果

示例输入:

6
5 2 -4 3 0 7

程序输出:

0
4
16

逐个认识函数

下面只列出本程序实际用到的写法;先看参数如何传入,再看返回值怎样保存或输出。

函数/写法功能与返回值注意事项
input()读取一行并返回字符串。本题分两行读取 n 和数字列表。
str.split()按空白拆分字符串,返回字符串列表。拆分得到的每项仍是文本。
int(text)把整数字符串转换为整数。循环中逐个转换数字文本。
range(n)产生从 0 到 n-1 的整数。适合重复 n 次并按下标读取输入项。
list.append(value)把一个值追加到列表末尾;返回 None。会直接修改原列表。
list.sort()将列表原地按升序排序;返回 None。排序后仍使用原来的 squares 列表。
print(value)输出一个值并换行;返回 None。本程序每个平方数单独一行输出。

分步读取输入

input() 读入一整行文本;split() 把这一行拆成多个数字文本。然后 for 循环每次取一个文本,用 int() 转成整数,再用 append() 加入 values 列表。

number_texts = input().split()
values = []
for index in range(n):
    number_text = number_texts[index]
    value = int(number_text)
    values.append(value)

这样每一步都有单独的变量,方便检查转换前后的内容。

循环筛选与平方

  1. 先创建空列表 squares,用来保存符合条件的结果。
  2. 循环逐个读取 values 中的整数 value。
  3. value % 2 == 0 表示除以 2 的余数为 0,也就是偶数。
  4. 遇到偶数时先计算 square = value * value,再用 append() 保存。
  5. 负偶数和 0 也符合条件;奇数则跳过。

排序并输出

squares.sort() 会直接修改 squares,把元素从小到大排列;它没有返回新的列表。之后用 for 循环逐个 print,每个数单独一行。

本题刻意使用初学者容易跟踪的普通循环。列表解析和 sorted() 可以等学会循环后再回来比较。

代码如何运行

  1. 先按左侧题目给出的格式输入数据;程序通过 input() 读取,并在需要时转换数据类型。
  2. 程序自上而下执行语句;遇到条件、循环或函数调用时,按照右侧算法说明更新变量和处理数据。
  3. 最后由 print() 输出计算结果。可将左侧示例输入与输出逐项对照。

先自己跟踪一组小数据,记录循环前后变量的值;这比只看最终答案更容易理解程序。

自己动手试一试

测试没有偶数、所有数都是偶数、包含负偶数和 0 的情况。

先在 lx03.py 中独立完成,再运行参考程序比较结果。修改程序时一次只改一个条件或步骤。