酒吧制作 - Python

时间:2014-04-24 00:25:33

标签: python for-loop while-loop

我正在编写一个函数,它接受一个列表变量并返回与列表中每个数字对应的垂直条。我真的只是一个简单的问题。也许,我在这里错过了一些东西。

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:

#     * 
#     * *
#   * * *

有人可以帮我编辑一下这个函数,以便它返回^。提前谢谢。

4 个答案:

答案 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 ) 

From Here!

答案 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()

编辑#2:

现在我看到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。它将帮助您了解如何在右侧对齐文本