如何使用Python列表将双骰子模拟结果输出为垂直条形图
双骰子投掷垂直条形图实现方案
完整可运行代码
import random from itertools import zip_longest # 获取用户输入投掷次数 n = int(input('enter how many times: ')) # 初始化频次列表,索引0对应点数和为2,索引10对应点数和为12 freq = [0] * 11 # 模拟投掷过程,修正原代码少执行1次的问题 for _ in range(n): x = random.randint(1, 6) y = random.randint(1, 6) sum_val = x + y freq[sum_val - 2] += 1 # 生成每个点数对应的星号条,每个星号加空格保证列对齐 bars = [] for count in freq: bars.append(['* '] * count) # 用zip_longest对齐所有星号条,空缺位置填充等长空格 # 倒序遍历行实现从上到下的垂直显示 for line in reversed(list(zip_longest(*bars, fillvalue=' '))): print(''.join(line)) # 打印底部刻度 print('2 3 4 5 6 7 8 9 10 11 12')
实现逻辑
- 优化原代码冗余的多列表存储逻辑,用单频次列表统计11种点数和的出现次数,避免大量重复判断
- 每个星号后带空格,保证各列宽度一致,避免条形错位
- 调用
zip_longest将不同长度的星号列表按最长频次对齐,空缺位置填充2个空格(和*长度匹配) - 倒序遍历对齐后的行,实现从顶部高值到底部低值的垂直条形显示,最后输出对齐的底部刻度
输出示例(输入100时)
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 2 3 4 5 6 7 8 9 10 11 12
内容的提问来源于stack exchange,提问作者cool_guy_123
相关产品推荐
相关产品推荐

