酒吧制作Python

2024-03-28 23:14:16 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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:

#     * 
#     * *
#   * * *

有人能帮我编辑这个函数,让它返回^。提前谢谢。在


Tags: 函数helper列表outputreturndeffunction数字
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])

输出:

^{pr2}$

我添加了一个10来证明这些条实际上是垂直的,与其他所有答案不同。。。在

def vBarGraphify(nums):
   for num in nums:
      print " {:>10}".format("*" * num)

编辑:

^{pr2}$

更像Python:

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,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函数。大部分内容保持不变,但现在我将整个过程视为行和列,然后转置二维数组以获得所需的列。在

^{pr2}$

相关问题 更多 >