从列表中获取数字并绘制图案

Get numbers from list and draw pattern

我有以下列表[2,7,4]。我需要从列表中取出数字,我想得到这样的输出:

    *
    *
    *
    *  *
    *  *
 *  *  *
 *  *  *
[2, 7, 4]

我写了以下内容:

a=eval(input())

for j in range(len(a)):
    
    print(a[j],end=" ")
    for i in range(0,a[j]):
        
        print(" *",end=" ")
            
    print()   

但是当我给出这个列表时,我得到这个输出:

2 * *
7 * * * * * * *
4 * * * *

打印总是从上到下,所以你需要找到数组中最大的数字才能从上到下打印它。

然后你必须从那个数字循环回到零并在适当的地方打印一个星号。在这种情况下,您可以将数字视为高度。例如,如果高度为 6,则必须仅在第二列打印星号(因为 7 >= 6),如果高度为 3,则需要在最后两列打印星号(因为 7 >= 3和 4 >= 3)。这是它在代码中的样子:

arr = [2, 7, 4]
max_num = max(arr)

# Determine if an asterisk or a space needs to be printed, based on a array
# element and the current height. 
def calc_output(array_element, cur_height):
    if array_element >= cur_height:
        return "*"

    return " "

# Loop from max_num to 1.
for x in range(max_num, 0, -1):
    line = ""

    # For every element in arr, determine if an asterisk need to be printed.
    for elem in arr:
        line += "{} ".format(calc_output(elem, x))
    
    print(line)

# Print the elements of arr separated with a space.
print(*arr)

这输出:

  *   
  *   
  *   
  * * 
  * * 
* * * 
* * * 
2 7 4

它也适用于任何其他数字列表。例如,arr = [4, 1, 3, 0, 4]:

*       * 
*   *   * 
*   *   * 
* * *   * 
4 1 3 0 4

如果您考虑以下几点,就可以解决这个问题:

  1. 您需要知道列表中的最大值,这样您就知道需要打印多少行。考虑到 [2, 7, 4] 是您的列表,7 是最大值。

  2. 您可以使用 for 循环和最大值 (max_value) 的值轻松打印以下模式:

for i in range(max_value):
    print(i)

哪个输出是:

7
6
5
4
3
2
1
  1. 对于列表中的每个元素,如果列表中的元素小于或等于列表中的当前索引 i,则在每一行打印 '* '循环。否则,打印 ' '

  2. 打印一行后,您需要移至下一行。

  3. 最后,您只需打印列表即可。

以下代码是上述算法的实现。我添加了显示算法步骤的内联注释:

l = l = [2, 7, 4]

max_value = max(l)

for i in range(max_value, 0, -1):
  for e in l:
    print('* ' if e >= i else '  ', end='')
  print()
print(*l)

max_value = max(l) # 1

for i in range(max_value, 0, -1): # 2
  for e in l:
    print('* ' if e >= i else '  ', end='') # 3
  print() # 4
print(*l) # 5

输出

  *   
  *   
  *   
  * * 
  * * 
* * * 
* * * 
2 7 4

请记住,这适用于列表中介于 09(含)之间的元素。