У меня есть следующий список [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 * * * *

1
MNMN 15 Янв 2021 в 16:53

2 ответа

Лучший ответ

Печать всегда выполняется сверху вниз, поэтому вам нужно найти наибольшее число в массиве, чтобы иметь возможность распечатать его сверху вниз.

Затем вам нужно перейти от этого числа к нулю и, при необходимости, вывести звездочку. Вы можете увидеть число в этом случае как высоту. Например, если высота равна 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
2
Bram Dekker 15 Янв 2021 в 14:23

Решить эту проблему можно, если учесть следующее:

  1. Вам нужно знать максимальное значение в списке, поэтому вы знаете, сколько строк вам нужно будет напечатать. Учитывая {{x0}} - ваш список, {{x1}} - это максимальное значение.

  2. Вы можете легко распечатать следующий шаблон, используя цикл for и значение максимального значения (max_value):

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

Какой результат:

7
6
5
4
3
2
1
  1. Для каждого элемента в списке в каждой строке печатается '* ', если элемент в списке меньше или равен текущему индексу i в цикле for. В противном случае печатается ' '.

  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

Имейте в виду, что это будет работать для элементов в списке от 0 до 9 (включительно).

0
lmiguelvargasf 18 Янв 2021 в 14:09