checkily 发表于 2018-1-31 11:37:18

这种打印的方法,是不是要用join方法?想不出怎样做

题目:
用字符做一个简单的直方图(柱状图)。已知每月的数据如下:

做出横坐标为月份的直方图。

|                *                                       *
|                *                           *         *
| *            *                           *         *
| *            *                           *         *
| *            *    *                        *         *
| *            *    *         *            *         *
| *    *         *    *         *            *    *    *
| *    *    *    *    *         *         *    *    *    *
| *    *    *    *    *    *    *         *    *    *    *
------------------------------------------------------------
1月2月3月4月5月6月7月8月9月10月 11月 12月

求大神指导。

orino 发表于 2018-1-31 11:42:14

最直接的就是使用列表设计一个二维数组,相当于打印一张9*12的表格,空的地方就用空格表示,有数据的地方就用*表示,然后横向输出

sky 发表于 2018-1-31 11:43:04

这种东西好像数据可视化做着更方便吧
百度 python 直方图

BngThea 发表于 2018-1-31 11:45:58

跟用不用jion没多大关系,关键看你想怎么设计,如果一定要用print函数打印,你需要设计每个字符之间的间隔,每一行的分布等

这种做图当然是交个库来实现,参考 matplotlib 库的各种做图函数

sky 发表于 2018-1-31 11:50:59

from pprint import pprint
data =

t = [[] for i in range(len(data))]
for i, n in enumerate(data):
    for j in range(n):
      t.append("*")


不会翻转{:10_278:}

checkily 发表于 2018-1-31 15:07:01

sky 发表于 2018-1-31 11:50
不会翻转

还没学到,但谢谢你。

gopythoner 发表于 2018-1-31 16:21:26

def func(nums):
    lis = [['|']+['   ' if max(nums)-x>i else '*' for x in nums] for i in range(max(nums))]
    lis.append(["-"]+['-----' for i in range(12)])
    lis.append([" "]+[' {}月 '.format(i) for i in range(1,13)])
    for i in lis:
      print(''.join(i))

if __name__ == '__main__':
    func()

|               *                                       *
|               *                           *         *
|*            *                           *         *
|*            *                           *         *
|*            *    *                        *         *
|*            *    *         *            *         *
|*    *         *    *         *            *    *    *
|*    *    *    *    *         *         *    *    *    *
|*    *    *    *    *    *    *         *    *    *    *
-------------------------------------------------------------
1月2月3月4月5月6月7月8月9月10月11月12月

gopythoner 发表于 2018-1-31 16:22:03

gopythoner 发表于 2018-1-31 16:21


我也是够无聊的,居然给你弄出来了一个

checkily 发表于 2018-2-1 09:04:15

gopythoner 发表于 2018-1-31 16:21


大神请留步,帮助小学生解决问题,并不是一件无聊的事。我就觉得用join的方法会比较好,但就是想不出来。你写的代码很好{:10_303:},但能解释一下思路吗?看得不是很明白。。{:10_262:}

gopythoner 发表于 2018-2-1 09:11:44

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

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

checkily 发表于 2018-2-1 09:36:39

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

这个思路跟我的想法是差不多的,至于代码如何实现,为什么要这样写,可能是我水平问题,还是不太理解。
页: [1]
查看完整版本: 这种打印的方法,是不是要用join方法?想不出怎样做