我正在尝试从一组用户输入值中绘制直方图。
好的,我将代码更新为:
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
* * * *
* * *
* * *
* *
* *
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
答案 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]: