Комплементарное выражение списка выводит только 1 строку вместо нескольких строк в последовательности треугольных чисел.

Вопрос или проблема

Комплементарное выражение списка выводит только 1 строку вместо нескольких строк в последовательности треугольных чисел.

    tri_num = []
    for i in range(1, 10):
        tri_num.append(i*(i+1)//2) 
        print(tri_num)

Привет, я прохожу курс по Python, и нам было предложено написать генератор списка, который создаёт именно такой же список, как показанный в коде выше. Вывод будет следующим:

    [1]
    [1, 3]
    [1, 3, 6]
    [1, 3, 6, 10]
    [1, 3, 6, 10, 15]
    [1, 3, 6, 10, 15, 21]
    [1, 3, 6, 10, 15, 21, 28]
    [1, 3, 6, 10, 15, 21, 28, 36]
    [1, 3, 6, 10, 15, 21, 28, 36, 45]

Я написал следующий код для генератора списка и получил следующее:

    tri_num = [(i*(i+1)//2)for i in range (1, 10)]
    print(tri_num)

    `вывод:`
    [1, 3, 6, 10, 15, 21, 28, 36, 45]

Буду признателен за любую помощь или совет!!!
Спасибо!

Я пробовал несколько вариантов этого генератора списка, без успеха.

tri_num = []
[tri_num.append(i*(i+1)//2) or print(tri_num) for i in range(1, 10)]

Ответ или решение

Вам необходимо реализовать генерацию треугольных чисел с использованием спискового включения (list comprehension) в Python, чтобы выводить промежуточные результаты в формате, аналогичном тому, что предоставляет ваш исходный код. Давайте разберем вашу задачу более мелко.

Ваш первый участок кода создает список треугольных чисел и выводит его на каждой итерации. Однако, когда вы пробовали использовать списковое включение, вы получили только окончательный список с одним выводом.

Вот как у вас изначально построен код:

tri_num = []
for i in range(1, 10):
    tri_num.append(i*(i+1)//2) 
    print(tri_num)

Теперь, чтобы добиться желаемого вами результата с использованием спискового включения, мы можем сделать следующее. Использование спискового включения для получения промежуточных значений и вывода на каждой итерации – это не совсем стандартный подход, потому что списковое включение предназначено для создания новых списков. Тем не менее, можно использовать for внутри списка, чтобы при каждом добавлении элемента в список также его напечатать.

Вот пример, как это можно сделать:

tri_num = []
[tri_num.append(i*(i+1)//2) or print(tri_num) for i in range(1, 10)]

Этот код создает пустой список tri_num, затем для каждого i в диапазоне от 1 до 9 вычисляет треугольное число и добавляет его в список. Оператор or используется для того, чтобы вызов print(tri_num) выполнялся после того, как метод append() добавил новое значение в список. Однако это несколько избыточный и не совсем понятный способ; списковые включения в основном используются для создания списков, а не для выполнения дополнительных действий.

Гораздо более идиоматическим способом в Python было бы придерживаться использования обычного цикла. Ваш первоначальный подход более читаем и понятен для других, кто будет читать ваш код.

Таким образом, окончательные выводы:

  1. Для такого рода задач лучше использовать обычные циклы вместо списковых включений.
  2. Если вы все же хотите использовать списковые включения, приведенный выше код работает, но может быть не самым удобочитаемым.

Надеюсь, это поможет вам! Если будут дополнительные вопросы, не стесняйтесь обращаться.

Оцените материал
Добавить комментарий

Капча загружается...