鱼C论坛

 找回密码
 立即注册
查看: 4197|回复: 10

[已解决]这种打印的方法,是不是要用join方法?想不出怎样做

[复制链接]
发表于 2018-1-31 11:37:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
题目:
用字符做一个简单的直方图(柱状图)。已知每月的数据如下:
[7, 3, 2, 9, 5, 1, 4, 0, 2, 8, 3, 9]
做出横坐标为月份的直方图。

  1. |                *                                       *
  2. |                *                             *         *
  3. | *              *                             *         *
  4. | *              *                             *         *
  5. | *              *    *                        *         *
  6. | *              *    *         *              *         *
  7. | *    *         *    *         *              *    *    *
  8. | *    *    *    *    *         *         *    *    *    *
  9. | *    *    *    *    *    *    *         *    *    *    *
  10. ------------------------------------------------------------
  11.   1月  2月  3月  4月  5月  6月  7月  8月  9月  10月 11月 12月
复制代码


求大神指导。
最佳答案
2018-1-31 16:21:26
  1. def func(nums):
  2.     lis = [['|']+['     ' if max(nums)-x>i else '  *  ' for x in nums] for i in range(max(nums))]
  3.     lis.append(["-"]+['-----' for i in range(12)])
  4.     lis.append([" "]+[' {}月 '.format(i) for i in range(1,13)])
  5.     for i in lis:
  6.         print(''.join(i))

  7. if __name__ == '__main__':
  8.     func([7, 3, 2, 9, 5, 1, 4, 0, 2, 8, 3, 9])
复制代码

  1. |                 *                                       *  
  2. |                 *                             *         *  
  3. |  *              *                             *         *  
  4. |  *              *                             *         *  
  5. |  *              *    *                        *         *  
  6. |  *              *    *         *              *         *  
  7. |  *    *         *    *         *              *    *    *  
  8. |  *    *    *    *    *         *         *    *    *    *  
  9. |  *    *    *    *    *    *    *         *    *    *    *  
  10. -------------------------------------------------------------
  11.   1月  2月  3月  4月  5月  6月  7月  8月  9月  10月  11月  12月
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-1-31 11:42:14 | 显示全部楼层
最直接的就是使用列表设计一个二维数组,相当于打印一张9*12的表格,空的地方就用空格表示,有数据的地方就用*表示,然后横向输出
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-31 11:43:04 | 显示全部楼层
这种东西好像数据可视化做着更方便吧
百度 python 直方图

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-31 11:45:58 | 显示全部楼层
跟用不用jion没多大关系,关键看你想怎么设计,如果一定要用print函数打印,你需要设计每个字符之间的间隔,每一行的分布等

这种做图当然是交个库来实现,参考 matplotlib 库的各种做图函数
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-31 11:50:59 | 显示全部楼层
  1. from pprint import pprint
  2. data = [7, 3, 2, 9, 5, 1, 4, 0, 2, 8, 3, 9]

  3. t = [[] for i in range(len(data))]
  4. for i, n in enumerate(data):
  5.     for j in range(n):
  6.         t[i].append("*")
复制代码


不会翻转
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-31 15:07:01 | 显示全部楼层

还没学到,但谢谢你。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-31 16:21:26 | 显示全部楼层    本楼为最佳答案   
  1. def func(nums):
  2.     lis = [['|']+['     ' if max(nums)-x>i else '  *  ' for x in nums] for i in range(max(nums))]
  3.     lis.append(["-"]+['-----' for i in range(12)])
  4.     lis.append([" "]+[' {}月 '.format(i) for i in range(1,13)])
  5.     for i in lis:
  6.         print(''.join(i))

  7. if __name__ == '__main__':
  8.     func([7, 3, 2, 9, 5, 1, 4, 0, 2, 8, 3, 9])
复制代码

  1. |                 *                                       *  
  2. |                 *                             *         *  
  3. |  *              *                             *         *  
  4. |  *              *                             *         *  
  5. |  *              *    *                        *         *  
  6. |  *              *    *         *              *         *  
  7. |  *    *         *    *         *              *    *    *  
  8. |  *    *    *    *    *         *         *    *    *    *  
  9. |  *    *    *    *    *    *    *         *    *    *    *  
  10. -------------------------------------------------------------
  11.   1月  2月  3月  4月  5月  6月  7月  8月  9月  10月  11月  12月
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-31 16:22:03 | 显示全部楼层

我也是够无聊的,居然给你弄出来了一个
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-1 09:04:15 | 显示全部楼层

大神请留步,帮助小学生解决问题,并不是一件无聊的事。我就觉得用join的方法会比较好,但就是想不出来。你写的代码很好,但能解释一下思路吗?看得不是很明白。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-1 09:11:44 | 显示全部楼层
checkily 发表于 2018-2-1 09:04
大神请留步,帮助小学生解决问题,并不是一件无聊的事。我就觉得用join的方法会比较好,但就是想不出来。 ...

首先,你要画一个条形图,就有2个关键参数,第一个是横坐标的长度,这个就是1-12个月固定了,然后就是纵坐标的高度,这个是不固定的,要看你给的数字里面最大的数是什么,就是max(nums)来决定。
长宽知道了,就好办,每一行都是一个列表,也即是总共有max(nums)个列表,每个列表里面包含了空格和星号,每个月有几个空白和几个星号,这个就可以通过每个月的数字跟最大值对比就知道了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-1 09:36:39 | 显示全部楼层
gopythoner 发表于 2018-2-1 09:11
首先,你要画一个条形图,就有2个关键参数,第一个是横坐标的长度,这个就是1-12个月固定了,然后就是纵 ...

这个思路跟我的想法是差不多的,至于代码如何实现,为什么要这样写,可能是我水平问题,还是不太理解。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-14 04:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表