Python:向下绘制直方图

时间:2017-04-22 19:27:13

标签: python histogram

我正在尝试从一组用户输入值中绘制直方图。

好的,我将代码更新为:

number1 = ""
number2 = ""
number3 = ""
number4 = ""

numbers = input("Enter a string of positive integers separated by spaces: ")
print(" ")
newNum = numbers.split()

line = 0
col = 0
lines = int(max(newNum))
length = len(newNum)

while line<lines:
    col = 0
    while col<length:
        if line<int(newNum[col]):
            print('* ', end = '')
        else:
            print('  ')
        col = col+1
    line = line+1
    print("")

但是当我运行代码时,我得到了这个:

Enter a string of positive integers separated by spaces: 1 3 20 5

* * * * 

* * * 

* * * 


* * 


* * 

为了让我的直方图像这样打印,我现在缺少什么?另外,为什么不将值打印到20?

Enter a string of positive integers separated by spaces: 1 3 20 5

* * * *
  * * *
  * * *
    * *
    * *
    *
    *
    *
    *
    *
    *
    *
    *
    *
    *
    *
    *
    *
    *
    *

4 个答案:

答案 0 :(得分:0)

您将不得不手动编程。

例如,如果我们在一条小于或低于该元素的线上。 这个粗略的样本应该指导你:

line = 0
col = 0
lines = max(newNum)
length = len(newNum)

return    
while line<lines:
    while col<length:
        if line<newNum[col]:
            print "* ",
        else:
            print "  ",
        col = col+1
    line = line+1
    print ""

答案 1 :(得分:0)

在您的示例中,您永远不会重置col;你可能应该在开始第二个while循环之前每次设置col=0

while line<lines:
    col=0
    while col<length:
        ...

否则内循环仅运行一次。

嵌套的for循环可能更自然......

当在一行内打印时,你不需要终结字符;您应该使用print('* ', end='')并在每行末尾使用空print()

然后你应该尽快将你的数字转换为整数:

newNum = [int(i) for i in numbers.split()]

否则max(newNum)将返回'5' - 字符串中的最高位。

您仍然遗失end=' '声明中的print(' ')

这可以解决你的问题。

更优雅的版本 - 倒数列表,直到列表仅包含零:

def vertical_histo(number_list):
    rest = number_list
    while any(rest):
        print(' '.join('*' if i else ' ' for i in rest))
        rest = [i-1 if i else 0 for i in rest]

# to get your example, call this function with:
vertical_histo(number_list=(1, 3, 20, 5)))

rest包含您仍需要为每列显示的*金额

rest = (1, 3, 20, 5)  # first round
rest = [0, 0, 17, 2]  # after 3 rounds
# ...etc
rest = [0, 0, 1, 0]   # last round
rest = [0, 0, 0, 0]   # when done

然后在每次迭代中向下(右)移动一次。

' '.join('*' if i else ' ' for i in ones)

然后为'*'中的每个条目创建一个rest的字符串,该字符串尚未为零。否则会添加' '

只要any(rest)包含非零条目,

True就是ones

答案 2 :(得分:0)

感谢大家!通过这段代码,我能够解决这个问题:

import argparse

# tell our parser what args to expect and what type they are
parser = argparse.ArgumentParser()
parser.add_argument('--jvm', type=int)
parser.add_argument('--cpu', type=int)

raw = '--jvm 100 --cpu 200'
# argparser expects a list of args so split the string on spaces
args = parser.parse_args(raw.split())

# access our parsed args
print args.jvm
print args.cpu

答案 3 :(得分:0)

让我们将名称data提供给包含直方图中每列深度的列表

data = [3, 5, 2]

您要打印多少行?

nrows = max(data) #=> 5

如果您要求Python计算行数,Python从0开始,并在nrows-1停止

for row in range(nrows): print(row) #=> 0 1 2 3 4

所以行没有。 3的索引row等于2,行号为。 4有索引3,现在想到直方图的第一列,你必须打印3 '+', 这意味着第3行中的'+'(即row=2)而第4行中没有任何内容(即row=3

'+' if (data[col] > row) else ' '

在此分析之后,我们可以编写计算直方图的函数

def histogram(data):
    return '\n'.join(
        ''.join('+' if depth>row else ' ' for depth in data)
        for row in range(max(data)))

我们准备测试它了

In [36]: def histogram(data):
    ...:         return '\n'.join(
    ...:             ''.join('+' if depth>row else ' ' for depth in data)
    ...:             for row in range(max(data)))
    ...: 

In [37]: print(histogram((3,4,5,6)))
++++
++++
++++
 +++
  ++
   +

In [38]: 

或者,更短,

In [38]: def histogram(d, nl='\n'.join, jn=''.join):
...:     return nl(jn('+'if n>r else' 'for n in d)for r in range(max(d)))
...: 

In [39]: print(histogram((3,4,5,6)))
++++
++++
++++
 +++
  ++
   +

In [40]: