我正在编写一个函数,它接受一个列表变量并返回与列表中每个数字对应的垂直条。我真的只是一个简单的问题。也许,我在这里错过了一些东西。
def vBarMaker(nums): # Helper Function
output = ""
while nums != 0:
nums -= 1
output += "*"
if nums == 0:
return output
def vBarGraphify(nums):
for num in nums:
print vBarMaker(num)
print vBarGraphify( [0,1,3,2] )
# ^ This returns
#
# *
# ***
# **
# But I want it to return:
# *
# * *
# * * *
有人可以帮我编辑一下这个函数,以便它返回^。提前谢谢。
答案 0 :(得分:4)
def vBarGraphify(nums):
for num in nums:
print " {:>10}".format("*" * num)
编辑:
def vBarGraphify( cols):
for row in range( max( cols ),0,-1 ) :
for col in cols:
print " " if col < row else "*",
print
更多PYTHONIC:
def vBarGraphify( nums ) :
# create 2d array of horizontal graph 10 X 4
original = [ [n < num for n in range(max(nums)) ] for num in nums ]
# rotate it 4 X 10
rotated = zip(*original)
# print each line.
for line in rotated[::-1]:
print "".join( "*" if col else " " for col in line )
答案 1 :(得分:3)
目前您有一个循环,输出相应的星号,直到达到该数字。您还需要考虑空白。我要做的是输出一个空格,用于与正在打印的星号的当前索引号相反的数字。
这就是说如果传递给函数的列表是[1,2,3]
那么在第一次迭代时,应该打印两个空格和*:' *'
并且在下一次迭代中,一个空格应该打印两个*:第三次迭代' **'
,打印三个*:'***'
我继续编写我的实现,尽管corn3lius的答案已经很棒了。我包括他的这里以及文档测试,所以你可以看到它是如何工作的。
我的答案和corn3lius'之间的主要区别在于,在corn3lius的答案中,左侧空白区域是硬编码的,而我的答案是根据给定列表中的最大数字生成的。
def BarGraphify1(nums):
'''
see http://stackoverflow.com/a/23257715/940217
>>> BarGraphify1([1,2,3])
*
**
***
'''
for num in nums:
print " {:>10}".format("*" * num)
def BarGraphify2(nums):
'''
>>> BarGraphify2([1,2,3])
*
**
***
>>> BarGraphify2([1,3,2])
*
***
**
'''
output = []
maxVal = max(nums)
for n in nums:
space = (maxVal-n)*' '
asterisks = n*'*'
output.append(space + asterisks)
print '\n'.join(output)
if __name__ == '__main__':
import doctest
doctest.testmod()
现在我看到OP想要编辑中显示的列,我已经重新设计了我的解决方案以使用numpy.transpose函数。其中大部分都保持不变,但现在我将整个事物视为行和列,然后转置2-D数组以获得所需的列。
import numpy
def BarGraphify3(nums):
'''
>>> BarGraphify3([1,2,3])
*
**
***
>>> BarGraphify3([1,3,2])
*
**
***
'''
grid = []
maxVal = max(nums)
for n in nums:
space = (maxVal-n)*' '
asterisks = n*'*'
grid.append(list(space + asterisks))
cols = []
for row in numpy.transpose(grid):
cols.append(''.join(row))
print '\n'.join(cols)
答案 2 :(得分:3)
如果您希望条形图是垂直的,那么每条打印线都需要考虑所有值,并且您需要与最大值一样多的线条:
def vBarGraphify(nums):
for row in vBarMaker(nums):
print row
def vBarMaker(nums):
outputs = []
for value in xrange(max(nums), 0, -1): # start with max, loop to zero
row = ''
for num in nums:
if num >= value: # is inside the bar
row += '*'
else:
row += ' '
outputs.append(row)
return outputs
vBarGraphify([0, 1, 2, 3, 10])
输出:
*
*
*
*
*
*
*
**
***
****
我添加了10
来证明条形图实际上是垂直的,与其他所有答案不同...
答案 3 :(得分:0)
你应该看看str.format。它将帮助您了解如何在右侧对齐文本