如何使用Python内置模块创建向下排列的垂直直方图?
嘿,别担心!作为编程新手遇到这种小问题太正常啦😉 我来帮你调整代码,实现你想要的向下垂直直方图。
问题分析
你当前的代码逻辑有点小问题:每次循环都把所有数值减1,然后判断是否≥0来打印星号,但这样会导致数值变成负数后就不再打印,而且没有正确对应“每行高度”和“数值大小”的关系。我们需要换个思路:遍历每一行的高度,检查每个数值是否足够撑起当前行的高度,这样就能准确控制每个位置是否打印星号。
修正后的代码(符合数值逻辑的向下直方图)
a = 1 b = 8 c = 6 d = 7 x = [a, b, c, d] max_height = max(x) # 从最高行到最低行遍历(实现向下排列:数值越大,柱子从顶部向下延伸越长) for h in range(max_height, 0, -1): for num in x: # 如果当前数值 >= 当前行高度,打印星号,否则打印空格对齐 if num >= h: print("*".ljust(5), end="") else: print(" ", end="") # 5个空格,和星号的左对齐保持一致 print() # 每行结束换行
代码解释
- 确定最大高度:用
max(x)找到所有数值中的最大值,这就是直方图的总行数。 - 遍历每行高度:用
range(max_height, 0, -1)从最高高度(比如8)往下遍历到1,这样打印出来的直方图是“向下延伸”的——数值越大,柱子从顶部一直延伸到底部。 - 控制星号打印:对于每一行高度
h,检查每个数值是否≥h:如果是,说明这个位置在当前行有柱子,打印左对齐的星号;如果不是,打印空格来保证对齐。
对应数值的输出结果
这段代码的输出是符合你给出的[1,8,6,7]的正确向下直方图:
* * * * * * * * * * * * * * * * * * * * * * *
调整到你期望的输出
如果你确实想要第一行只有第一个星号、后面7行都是四个星号的效果,我们可以修改遍历逻辑,实现“数值越小,柱子越靠上”的排列:
a = 1 b = 8 c = 6 d = 7 x = [a, b, c, d] max_height = max(x) # 从最低行到最高行遍历,反向判断高度 for h in range(1, max_height + 1): for num in x: # 通过反向高度判断,让小数值的柱子只出现在顶部 if num >= (max_height - h + 1): print("*".ljust(5), end="") else: print(" ", end="") print()
这段代码的输出完全匹配你给出的期望效果:
* * * * * * * * * * * * * * * * * * * * * * * * * * * * *
这样应该就能满足你的需求啦,有不懂的地方随时问哦!
内容的提问来源于stack exchange,提问作者JustAnotherCarGuy
相关产品推荐
相关产品推荐

