如何使用Python列表推导式实现空心正方形的正确打印?
如何用列表推导式实现多行空心正方形输出?
我懂你遇到的问题——原来的嵌套循环靠外层循环结束时的print()来换行,但你写的列表推导式把所有字符都塞进了一个一维列表,打印的时候自然就挤成一行了。咱们来调整一下列表推导式的结构,就能解决这个问题。
核心思路:按行生成完整字符串
我们可以让列表推导式先生成每一行的完整字符串,而不是所有零散的字符。具体来说,外层遍历行号i,内层遍历该行的每个列号j,把一行的字符拼接成一个字符串,最后用换行符把所有行串起来打印。
修改后的代码如下:
side = int(input()) # 外层生成每行的字符串,内层生成该行的每个字符 square = [''.join(['*' if (i == 0 or i == side - 1 or j == 0 or j == side - 1) else ' ' for j in range(side)]) for i in range(side)] # 用换行符连接所有行并打印 print('\n'.join(square))
更简洁的写法(可选)
如果你想少写一层嵌套,也可以在生成字符的时候,每一行的末尾额外添加一个换行符,这样最后直接拼接所有字符就行:
side = int(input()) square = ['*' if (i == 0 or i == side - 1 or j == 0 or j == side - 1) else ' ' for i in range(side) for j in range(side)] # 手动插入换行符:每side个字符后加一个换行 square_with_newlines = [] for idx, char in enumerate(square): square_with_newlines.append(char) if (idx + 1) % side == 0: square_with_newlines.append('\n') print(''.join(square_with_newlines))
不过第一种按行生成字符串的方式可读性更高,也更符合列表推导式的简洁风格。
内容的提问来源于stack exchange,提问作者user4516038




