Python урок 4. списки или массивы в питоне
Содержание:
- Вложенные списки: создание
- Простая генерация
- Копии и представления
- Работа с массивами с заданным размером в Python
- Перестройка массива
- Через телефон
- В чем отличие DDR3 и DDR3L
- Срез строки в Python
- Как изменить скорость прокрутки при чтении текста?
- 10. Приложение 2. Ссылки по теме
- Массив нарезки
- Обработка двумерного массива: пример
- Двумерные массивы
- Как вы вводите двумерный массив?
- 4. Выражения-генераторы
- Ввод-вывод массива
Вложенные списки: создание
Предположим, что указаны два числа: число строк и количество столбцов . Вы должны создать список размером × , заполненный, скажем, нулями.
Очевидное решение кажется неправильным:
a = * m] * n
Это можно легко увидеть, если вы установите значение на , а затем распечатаете значение — оно также будет равно 5. Причина в том, что возвращает только ссылку на список из нулей, но не список. Последующее повторение этого элемента создает список из элементов, все ссылки на один и тот же список (как и операция для списков не создает новый список), поэтому все строки в результирующем списке на самом деле одинаковы строка.
Используя наш визуализатор, отслеживайте идентификатор списков. Если два списка имеют одинаковый номер id, это фактически тот же список в памяти.
None
n = 3 m = 4 a = * m] * n a = 5 print(a)
Таким образом, двумерный список не может быть создан просто путем повторения строки. Что делать?..
Возможный способ: вы можете создать список из элементов (например, из нулей), а затем сделать каждый из элементов ссылкой на другой одномерный список из элементов:
None
n = 3 m = 4 a = * n for i in range(n): a = * m
Другой (но похожий) способ: создать пустой список, а затем к нему новый элемент раз (этот элемент должен быть списком длины ):
None
n = 3 m = 4 a = [] for i in range(n): a.append( * m)
Но самый простой способ — использовать генератор, создавая список из элементов, каждый из которых представляет собой список из нулей:
None
n = 3 m = 4 a = * m for i in range(n)]
В этом случае каждый элемент создается независимо от других. Список раз помечается как новый, и копирование ссылок не происходит.
Простая генерация
Самым простым способом создания списка является обычное присваивание ему необходимых значений или объектов. В том случае, когда элементов последовательности немного, их можно просто перечислить один за другим. Но если их количество переваливает за десяток, следует всерьез задуматься об использовании генератора списка. Данная конструкция обеспечивает его автоматическое заполнение, исходя из определенных инструкций.
Следующий пример демонстрирует создание в Python списка чисел при помощи генератора. Переменная i является ссылкой на текущий элемент объекта data. Функция range здесь принимает два аргумента, которые устанавливают границы для сгенерированной последовательности целых чисел. Вывод информации на экран происходит через метод print.
>>> data = >>> print(data)
Генераторы списка Python 3 работают не только с численными значениями. Как показывает следующий пример, генератору можно передать в качестве аргумента строку либо ссылку на нее.
>>> data = >>> print(data)
В результате выполнения этого кода будет построен список из символов, которые включала в себя исходная строка. Как и в случае с предыдущим примером, вывести полученный набор данных на экран можно при помощи уже известного метода print.
Копии и представления
При работе с массивами, их данные иногда необходимо копировать в другой массив, а иногда нет. Это часто является источником путаницы. Возможно 3 случая:
Вообще никаких копий
Простое присваивание не создает ни копии массива, ни копии его данных:
Python передает изменяемые объекты как ссылки, поэтому вызовы функций также не создают копий.
Представление или поверхностная копия
Разные объекты массивов могут использовать одни и те же данные. Метод view() создает новый объект массива, являющийся представлением тех же данных.
Срез массива это представление:
Глубокая копия
Метод copy() создаст настоящую копию массива и его данных:
Строки и списки в Python состоят из элементов, занимающих свои нумерованные позиции в иерархии. К любому элементу, можно обратиться по его порядковому номеру – индексу. Отсчет начинается с нуля и ведется слева направо.
Работа с массивами с заданным размером в Python
Объявление массива в Python известного размера
Массив с определенным числом элементов N в Python объявляется так, при этом всем элементам массива присваивается нулевое значениеНазвание массива = *NЗадание значений элементов массива в python.
Задать значение элементов массива можно при объявлении массива. Это делается такНазвание массива =
Название массива = значение элемента
При этом массив будет иметь фиксированный размер согласно количеству элементов.
Пример. Задание значений элементов массива в Python двумя способами.
Способ №1.a =
Способ №2.a = 0
a = 1
a = 2
a = 3
a = 4
Таблица основных типов данных в Python.
При работе с массивами удобно использовать цикл for для перебора всех элементов массива.a = * размер массива
for i in range(размер массива):
a = выражение
Размер массива в Питон можно узнать с помощью команды len(имя массива)
Пример программы на Python, которая вводит массив с клавиатуры, обрабатывает элементы и выводит на экран измененный массив С клавиатуры вводятся все элементы массива, значения элементов увеличиваются в два раза. Выводим все значения элементов в консоль. Чтобы элементы массива выводились в одну строку через пробел, используем параметр end =» » в операторе вывода на экран print(a, end = » «)a = * 4
for i in range(len(a)):
i = str(i + 1)
print(«Введите элемент массива » + i, end = » «)
i = int(i)
i = i — 1
a = int(input())
print(«»)
for i in range(len(a)):
a = a * 2
for i in range(len(a)):
print(a, end = » «)Алгоритм поиска минимального значения массива в python
Нужно перебрать все элементы массива и каждый элемент сравнить с текущим минимумом. Если текущий элемент меньше текущего минимума, то этот элемент становится текущим минимумом.Алгоритм поиска максимального значения массива в python.
Аналогично, для поиска максимального значения нужно перебрать и сравнить каждый элемент с текущим максимумом. Если текущий элемент больше текущего максимума, то текущий максимум приравнивается к этому элементу.
Пример. Программа запрашивает значения элементов массива и выводит минимальное и максимальное значения на экран.a = * 9
for i in range(len(a) — 1):
i = str(i + 1)
print(«Введите элемент массива » + i, end = » «)
i = int(i)
a = int(input())
min = a
max = a
for i in range(len(a)):
if (a< min):
min = a
if (a > max):
max = a
min = str(min)
max = str(max)
print(«Минимальное значение = » + min)
print(«Максимальное значение = » + max)
Перестройка массива
После нарезки данных вам может понадобиться изменить их.
Например, некоторые библиотеки, такие как scikit-learn, могут требовать, чтобы одномерный массив выходных переменных (y) был сформирован как двумерный массив с одним столбцом и результатами для каждого столбца.
Некоторые алгоритмы, такие как рекуррентная нейронная сеть с короткой кратковременной памятью в Keras, требуют ввода данных в виде трехмерного массива, состоящего из выборок, временных шагов и функций.
Важно знать, как изменить ваши массивы NumPy, чтобы ваши данные соответствовали ожиданиям конкретных библиотек Python. Мы рассмотрим эти два примера
Форма данных
Массивы NumPy имеют атрибут shape, который возвращает кортеж длины каждого измерения массива.
Например:
При выполнении примера печатается кортеж для одного измерения.
Кортеж с двумя длинами возвращается для двумерного массива.
Выполнение примера возвращает кортеж с количеством строк и столбцов.
Вы можете использовать размер измерений вашего массива в измерении формы, например, указав параметры.
К элементам кортежа можно обращаться точно так же, как к массиву, с 0-м индексом для числа строк и 1-м индексом для количества столбцов. Например:
Запуск примера позволяет получить доступ к конкретному размеру каждого измерения.
Изменить форму 1D в 2D Array
Обычно требуется преобразовать одномерный массив в двумерный массив с одним столбцом и несколькими массивами.
NumPy предоставляет функцию reshape () для объекта массива NumPy, который можно использовать для изменения формы данных.
Функция reshape () принимает единственный аргумент, который задает новую форму массива. В случае преобразования одномерного массива в двумерный массив с одним столбцом кортеж будет иметь форму массива в качестве первого измерения (data.shape ) и 1 для второго измерения.
Собрав все это вместе, мы получим следующий проработанный пример.
При выполнении примера печатается форма одномерного массива, изменяется массив, чтобы иметь 5 строк с 1 столбцом, а затем печатается эта новая форма.
Изменить форму 2D в 3D Array
Обычно требуется преобразовать двумерные данные, где каждая строка представляет последовательность в трехмерный массив для алгоритмов, которые ожидают множество выборок за один или несколько временных шагов и одну или несколько функций.
Хорошим примером являетсямодель в библиотеке глубокого обучения Keras.
Функция изменения формы может использоваться напрямую, указывая новую размерность. Это ясно с примером, где каждая последовательность имеет несколько временных шагов с одним наблюдением (функцией) на каждый временной шаг.
Мы можем использовать размеры в атрибуте shape в массиве, чтобы указать количество выборок (строк) и столбцов (временных шагов) и зафиксировать количество объектов в 1
Собрав все это вместе, мы получим следующий проработанный пример.
При выполнении примера сначала печатается размер каждого измерения в двумерном массиве, изменяется форма массива, а затем суммируется форма нового трехмерного массива.
Через телефон
Проще всего менять привязку к номеру сотового именно через телефон, потому что мобильная версия Инстаграма имеет более широкий функционал, чем компьютерная. Ниже мы пошагово опишем процесс изменения номера в модификации приложения для разных операционных систем.
Android
В гаджетах на базе Андроид (и смартфонах, и планшетах), чтобы изменить номер мобильного телефона, необходимо действовать таким образом:
- Запускаем Инстаграм.
- В нижней панели меню тапаем на свою аватарку или значок человечка, чтобы перейти в профиль.
- В новом окне под количеством публикаций, подписчиков и подписок выбираем надпись «Редактировать профиль».
- Пролистываем вниз и доходим до раздела «Личная информация».
- Заходим в пункт «Номер телефона».
- Вводим свой новый номер, который хотим привязать к странице в Инстаграм и нажимаем кнопку подтверждения.
Готово! Номер изменен, теперь уведомления будут высылаться на него.
Iphone
Чтобы изменить привязанный к аккаунту в Инстаграме номер, на Айфоне следует выполнить такие шаги:
- Открываем Инстаграм.
- На нижней панели в правом нижнем углу находим значок свой аватарки или человечка.
- Переходим в меню изменения данных через клавишу «Редактировать профиль», которая находится справа от аватарки.
- Листаем меню, переходим к разделу «Личные данные».
- В графе «Номер телефона» вводим новую комбинацию, предварительно нажав на нее.
- Подтверждаем свои действия.
Готово! После этого ваш номер в профиле Инстаграм будет изменен.
В чем отличие DDR3 и DDR3L
Срез строки в Python
Иногда требуется получить из строки не один символ, а сразу несколько по некоторой закономерности – первые 2, каждый 3-ий или 4 последних. Для этого существуют срезы. Мы выборочно срезаем нужные символы и обращаемся по срезу. Надо отметить, что физически срезанные символы, остаются на своих местах. Сама строка никоим образом не меняется, мы работаем со срезанными копиями.
Возьмем первые три символа у строки ‘срезы Python’. В параметрах передадим два индекса – начало и конец среза. При срезе первый индекс входит включительно, а второй индекс не входит в выборку.
slice = ‘срезы Python’ print(slice) сре #символ ‘з’ не попал в выборку
Если не указаны начало или конец среза, то по умолчанию берётся первый или последний элемент коллекции.
slice = ‘срезы Python’ print(slice) Python #с индекса 6 и до конца
slice = ‘срезы Python’ print(slice) срезы #с начала строки до 5-го индекса включительно
slice = ‘срезы Python’ print(slice) срезы Python #выводит строку целиком
Третьим параметром у срезов, может передаваться шаг.
slice = ‘срезы Python’ print(slice) сеыPto #выводит символы через один
Как изменить скорость прокрутки при чтении текста?
При чтении веб-страниц или вордовских документов часто приходится перелистывать текст вперед или назад, воспользовавшись колесиком. Чтобы кастомизировать скорость прокрутки текста, можно воспользоваться специальным ползунком, доступном в настройках системы.
Заходим в параметры Windows, воспользовавшись стартовым меню «Пуск».
Далее открываем раздел «Устройства» и в открытой форме входим в подсекцию «Сенсорная панель и мышь».
Как видим, тут есть ползунок, отвечающий за количество строк, которые будут прокручиваться за один заход при единоразовой прокрутке колесика мыши.
Выставляем этот ползунок в нужное положение, параллельно тестируя выставленные значения на одном из документов в браузере либо в текстовом редакторе. Останавливаемся и закрываем окно, когда положение установленного индикатора будет вас удовлетворять. Идем дальше.
10. Приложение 2. Ссылки по теме
- Хорошая англоязычная статья с детальным объяснением что такое генераторы и итераторы
- Если у Вас есть сложности с пониманием логики работы с генераторными выражениями, посмотрите интересную англоязычную статью, где проводятся аналогии между генераторными выражениями и работой с SQL и таблицами Excel.
- UPD от fireSparrow: Существуюет расширение Python — PythonQL, позволяющее работать с базами данных в стиле генераторов коллекций.
- Иллюстрированная статья на английском, довольно наглядно показывает синтаксис генераторных выражений.
- Если требуются дополнительные примеры по теме вложенных генераторных выражений (статья на английском).
Часть 1 | Часть 2 | Часть 3 | Часть 4 |
---|
Приглашаю к обсуждению:
Если я где-то допустил неточность или не учёл что-то важное — пишите в комментариях, важные комментарии будут позже добавлены в статью с указанием вашего авторства.
Если какие-то моменты не понятны и требуется уточнение — пишите ваши вопросы в комментариях — или я или другие читатели дадут ответ, а дельные вопросы с ответами будут позже добавлены в статью.
Массив нарезки
Все идет нормально; Создание и индексация массивов выглядит знакомо.
Теперь мы подошли к нарезке массивов, и это одна из функций, которая создает проблемы для начинающих массивов Python и NumPy.
Структуры, такие как списки и массивы NumPy, могут быть нарезаны. Это означает, что подпоследовательность структуры может быть проиндексирована и извлечена.
Это наиболее полезно при машинном обучении при указании входных и выходных переменных или разделении обучающих строк из строк тестирования.
Нарезка задается с помощью оператора двоеточия ‘:’ с ‘от’ а также ‘в‘Индекс до и после столбца соответственно. Срез начинается от индекса «от» и заканчивается на один элемент перед индексом «до».
Давайте рассмотрим несколько примеров.
Одномерная нарезка
Вы можете получить доступ ко всем данным в измерении массива, указав срез «:» без индексов.
При выполнении примера печатаются все элементы в массиве.
Первый элемент массива можно разрезать, указав фрагмент, который начинается с индекса 0 и заканчивается индексом 1 (один элемент перед индексом «до»)
Выполнение примера возвращает подмассив с первым элементом.
Мы также можем использовать отрицательные индексы в срезах. Например, мы можем нарезать последние два элемента в списке, начав срез с -2 (второй последний элемент) и не указав индекс «до»; это берет ломтик до конца измерения.
Выполнение примера возвращает подмассив только с двумя последними элементами.
Двумерная нарезка
Давайте рассмотрим два примера двумерного среза, которые вы, скорее всего, будете использовать в машинном обучении.
Разделение функций ввода и вывода
Распространено загруженные данные на входные переменные (X) и выходную переменную (y).
Мы можем сделать это, разрезая все строки и все столбцы до, но перед последним столбцом, затем отдельно индексируя последний столбец.
Для входных объектов мы можем выбрать все строки и все столбцы, кроме последнего, указав ‘:’ в индексе строк и: -1 в индексе столбцов.
Для выходного столбца мы можем снова выбрать все строки, используя ‘:’, и индексировать только последний столбец, указав индекс -1.
Собрав все это вместе, мы можем разделить 3-колоночный 2D-набор данных на входные и выходные данные следующим образом:
При выполнении примера печатаются разделенные элементы X и y
Обратите внимание, что X — это двумерный массив, а y — это одномерный массив
Сплит поезд и тестовые ряды
Обычно загруженный набор данных разбивают на отдельные наборы поездов и тестов.
Это разделение строк, где некоторая часть будет использоваться для обучения модели, а оставшаяся часть будет использоваться для оценки мастерства обученной модели.
Для этого потребуется разрезать все столбцы, указав «:» во втором индексе измерения. Набор обучающих данных будет содержать все строки от начала до точки разделения.
Тестовым набором данных будут все строки, начиная с точки разделения до конца измерения.
Собрав все это вместе, мы можем разделить набор данных в надуманной точке разделения 2.
При выполнении примера выбираются первые две строки для обучения и последняя строка для набора тестов.
Обработка двумерного массива: пример
Предположим, вам задан квадратный массив (массив из строк и столбцов). Предположим, вы должны установить элементы главной диагонали, равные 1 (т. Е. Те элементы для которых ), чтобы установить элементы выше, чем диагональ, равная 0, и установить элементы ниже этой диагонали, равной 2. То есть вам нужно создать такой массив (пример для ):
1 0 0 0 2 1 0 0 2 2 1 0 2 2 2 1
Мы стремимся показать вам несколько способов решения этой проблемы
Во-первых, обратите внимание, что элементы, лежащие над главной диагональю, — это элементы для которых , а для элементов ниже главной диагонали. Таким образом, мы можем сравнить значения и , определяющие значение
Мы получаем следующий алгоритм:
None
n = 4 a = * n for i in range(n)] for i in range(n): for j in range(n): if i < j: a = 0 elif i > j: a = 2 else: a = 1 for row in a: print(' '.join())
Этот алгоритм медленный: он использует два цикла и для каждой пары выполняет одну или две команды . Если мы усложним алгоритм, мы сможем сделать это без условного оператора.
Сначала заполните основную диагональ, для которой нам понадобится один цикл:
for i in range(n): a = 1
Затем заполните нулями все элементы над главной диагональю. Чтобы сделать это, для каждой строки с номером вам нужно присвоить значение для = , …, . Для этого вам нужны вложенные циклы:
for i in range(n): for j in range(i + 1, n): a = 0
По аналогии, для = , …, задайте элементы равными :
for i in range(n): for j in range(0, i): a = 2
Вы можете комбинировать весь этот код и получить другое решение:
None
n = 4 a = * n for i in range(n)] for i in range(n): for j in range(0, i): a = 2 a = 1 for j in range(i + 1, n): a = 0 for row in a: print(' '.join())
Вот еще одно решение, которое повторяет списки для создания следующих строк списка. строка списка состоит из чисел , за которым следует одно целое число , за которым следуют нули:
None
n = 4 a = * n for i in range(n): a = * i + + * (n - i - 1) for row in a: print(' '.join())
Как обычно, вы можете заменить петлю генератором:
None
n = 4 a = * n a = * i + + * (n - i - 1) for i in range(n)] for row in a: print(' '.join())
Двумерные массивы
Выше везде элементами массива были числа. Но на самом деле элементами массива может быть что угодно, в том числе другие массивы. Пример:
a = b = c = z =
Что здесь происходит? Создаются три обычных массива , и , а потом создается массив , элементами которого являются как раз массивы , и .
Что теперь получается? Например, — это элемент №1 массива , т.е. . Но — это тоже массив, поэтому я могу написать — это то же самое, что , т.е. (не забывайте, что нумерация элементов массива идет с нуля). Аналогично, и т.д.
То же самое можно было записать проще:
z = , , ]
Получилось то, что называется двумерным массивом. Его можно себе еще представить в виде любой из этих двух табличек:
Первую табличку надо читать так: если у вас написано , то надо взять строку № и столбец №. Например, — это элемент на 1 строке и 2 столбце, т.е. -3. Вторую табличку надо читать так: если у вас написано , то надо взять столбец № и строку №. Например, — это элемент на 2 столбце и 1 строке, т.е. -3. Т.е. в первой табличке строка — это первый индекс массива, а столбец — второй индекс, а во второй табличке наоборот. (Обычно принято как раз обозначать первый индекс и — второй.)
Когда вы думаете про таблички, важно то, что питон на самом деле не знает ничего про строки и столбцы. Для питона есть только первый индекс и второй индекс, а уж строка это или столбец — вы решаете сами, питону все равно
Т.е. и — это разные вещи, и питон их понимает по-разному, а будет 1 номером строки или столбца — это ваше дело, питон ничего не знает про строки и столбцы. Вы можете как хотите это решить, т.е. можете пользоваться первой картинкой, а можете и второй — но главное не запутайтесь и в каждой конкретной программе делайте всегда всё согласованно. А можете и вообще не думать про строки и столбцы, а просто думайте про первый и второй индекс.
Обратите, кстати, внимание на то, что в нашем примере (массив, являющийся вторым элементом массива ) короче остальных массивов (и поэтому на картинках отсутствует элемент в правом нижнем углу). Это общее правило питона: питон не требует, чтобы внутренние массивы были одинаковой длины
Вы вполне можете внутренние массивы делать разной длины, например:
x = , , , [], ]
здесь нулевой массив имеет длину 4, первый длину 2, второй длину 3, третий длину 0 (т.е. не содержит ни одного элемента), а четвертый длину 1. Такое бывает надо, но не так часто, в простых задачах у вас будут все подмассивы одной длины.
(На самом деле даже элементы одного массива не обязаны быть одного типа. Можно даже делать так: , здесь нулевой элемент массива — сам является массивом, а еще два элемента — просто числа. Но это совсем редко бывает надо.)
Как вы вводите двумерный массив?
Скажем, программа принимает входной двумерный массив в виде строк, каждый из которых содержит чисел, разделенных пробелами. Как заставить программу читать ее? Пример того, как вы можете это сделать:
3 1 2 3 4 5 6 7 8 9
# первая строка ввода - это количество строк массива n = int(input()) a = [] for i in range(n): a.append()
Или, не используя сложные вложенные вызовы:
3 1 2 3 4 5 6 7 8 9
# первая строка ввода - это количество строк массива n = int(input()) a = [] for i in range(n): row = input().split() for i in range(len(row)): row = int(row) a.append(row)
Вы можете сделать то же самое с генераторами:
3 1 2 3 4 5 6 7 8 9
# первая строка ввода - это количество строк массива n = int(input()) a = for i in range(n)]
4. Выражения-генераторы
выдают элемент по-одному, не загружая в память сразу всю коллекцию расход памяти «упадет» с MemoryError
Особенности выражений-генераторов
Генаратор нельзя писать без скобок — это синтаксическая ошибка.
При передаче в функцию дополнительные скобки необязательны
Нельзя получить длину функцией len()
Нельзя распечатать элементы функцией print()
Обратите внимание, что после прохождения по выражению-генератору оно остается пустым!
Выражение-генератор может быть бесконечным.Будьте осторожны в работе с такими генераторами, так как при не правильном использовании «эффект» будет как от бесконечного цикла.
К выражению-генератору не применимы срезы!
Из генератора легко получать нужную коллекцию. Это подробно рассматривается в следующей главе.
Ввод-вывод массива
Как вам считывать массив? Во-первых, если все элементы массива задаются в одной строке входного файла. Тогда есть два способа. Первый — длинный, но довольно понятный:
a = input().split() # считали строку и разбили ее по пробелам # получился уже массив, но питон пока не понимает, что в массиве числа for i in range(len(a)): a = int(a) # прошли по всем элементам массива и превратили их в числа
Второй — покороче, но попахивает магией:
a = list(map(int, input().split()))
Может показаться страшно, но на самом деле вы уже встречали в конструкции
x, y = map(int, input().split())
когда вам надо было считать два числа из одной строки. Это считывает строку (), разбивает по пробелам (), и превращает каждую строку в число (). Для чтения массива все то же самое, только вы еще заворачиваете все это в , чтобы явно сказать питону, что это массив.
Какой из этих двух способов использовать для чтения данных из одной строки — выбирать вам.
Обратите внимание, что в обоих способах вам не надо знать заранее, сколько элементов будет в массиве — получится столько, сколько чисел в строке. В задачах часто бывает что задается сначала количество элементов, а потом (обычно на следующей строке) сами элементы
Это удобно в паскале, c++ и т.п., где нет способа легко считать числа до конца строки; в питоне вам это не надо, вы легко считываете сразу все элементы массива до конца строки, поэтому заданное число элементов вы считываете, но дальше не используете:
n = int(input()) # больше n не используем a = list(map(int, input().split()))
Еще бывает, что числа для массива задаются по одному в строке. Тогда вам проще всего заранее знать, сколько будет вводиться чисел. Обычно как раз так данные и даются: сначала количество элементов, потом сами элементы. Тогда все вводится легко:
n = int(input()) a = [] # пустой массив, т.е. массив длины 0 for i in range(n): a.append(int(input())) # считали число и сразу добавили в конец массива
Более сложные варианты — последовательность элементов по одному в строке, заканчивающаяся нулем, или задано количество элементов и сами элементы в той же строке — придумайте сами, как сделать (можете подумать сейчас, можете потом, когда попадется в задаче). Вы уже знаете все, что для этого надо.
Как выводить массив? Если надо по одному числу в строку, то просто:
for i in range(len(a)): print(a)
Если же надо все числа в одну строку, то есть два способа. Во-первых, можно команде передать специальный параметр , который обозначает «заканчивать вывод пробелом (а не переводом строки)»:
for i in range(len(a)): print(a, end=" ")
Есть другой, более простой способ:
print(*a)
Эта магия обозначает вот что: возьми все элементы массива и передай их отдельными аргументами в одну команду . Т.е. получается .