Вопрос или проблема
Комплементарное выражение списка выводит только 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 было бы придерживаться использования обычного цикла. Ваш первоначальный подход более читаем и понятен для других, кто будет читать ваш код.
Таким образом, окончательные выводы:
- Для такого рода задач лучше использовать обычные циклы вместо списковых включений.
- Если вы все же хотите использовать списковые включения, приведенный выше код работает, но может быть не самым удобочитаемым.
Надеюсь, это поможет вам! Если будут дополнительные вопросы, не стесняйтесь обращаться.