Как построчно вывести весь список Python?
Highly active question. Earn 10 reputation (not counting the association bonus) in order to answer this question. The reputation requirement helps protect this question from spam and non-answer activity.
-
Важное на Мете
Связанные
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.11.15.1019
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Запись списка в файл с новыми строками в Python
Списки являются одним из наиболее часто используемых структур данных в Python. Бывают ситуации, когда необходимо записать содержимое списка в файл. Встроенный метод writelines() может использоваться для записи элементов списка в файл. Однако, этот метод записывает элементы списка непосредственно друг за другом, без вставки символа новой строки ( \n ) между ними.
Возьмем следующий пример:
my_list = ['apple', 'banana', 'cherry'] with open('my_file.txt', 'w') as f: f.writelines(my_list)
При открытии файла my_file.txt , получится следующее:
Вместо того, чтобы каждый элемент списка был на новой строке. Для решения этой проблемы, можно воспользоваться генератором списка для добавления символа новой строки к каждому элементу списка перед его записью в файл.
my_list = ['apple', 'banana', 'cherry'] with open('my_file.txt', 'w') as f: f.writelines(f"\n" for item in my_list)
Теперь, при открытии файла my_file.txt , каждый элемент списка будет на новой строке:
apple banana cherry
Таким образом, можно использовать генераторы списков для добавления символов новой строки при записи списка в файл в Python.
Многомерные списки
Часто в задачах приходится хранить прямоугольные таблицы с данными. Такие таблицы называются матрицами или двумерными массивами. В языке программирования Питон таблицу можно представить в виде списка строк, каждый элемент которого является в свою очередь списком, например, чисел. Например, создать числовую таблицу из двух строк и трех столбцов можно так:
a = [[1, 2, 3], [4, 5, 6]]
Здесь первая строка списка a[0] является списком из чисел [1, 2, 3] . То есть a[0][0] == 1 , значение a[0][1] == 2 , a[0][2] == 3 , a[1][0] == 4 , a[1][1] == 5 , a[1][2] == 6 .
Для обработки и вывода списка как правило используется два вложенных цикла. Первый цикл по номеру строки, второй цикл по элементам внутри строки. Например, вывести двумерный числовой список на экран построчно, разделяя числа пробелами внутри одной строки, можно так:
for i in range(len(a)): for j in range(len(a[i])): print(a[i][j], end=' ') print()
То же самое, но циклы не по индексу, а по значениям списка:
for row in a: for elem in row: print(elem, end=' ') print()
Естественно для вывода одной строки можно воспользоваться методом join :
for row in a: print(' '.join(map(str, row)))
Используем два вложенных цикла для подсчета суммы всех чисел в списке:
s = 0 for i in range(len(a)): for j in range(len(a[i])): s += a[i][j]
Или то же самое с циклом не по индексу, а по значениям строк:
s = 0 for row in a: for elem in row: s += elem
Создание списка
Пусть даны два числа: количество строк n и количество столбцов m . Необходимо создать список размером n × m , заполненный нулями.
Очевидное решение оказывается неверным:
a = [[0] * m] * n
В этом легко убедиться, если присвоить элементу a[0][0] значение 1 , а потом вывести значение другого элемента a[1][0] — оно тоже будет равно 1! Дело в том, что [0] * m возвращает ccылку на список из m нулей. Но последующее повторение этого элемента создает список из n элементов, которые являются ссылкой на один и тот же список (точно так же, как выполнение операции b = a для списков не создает новый список), поэтому все строки результирующего списка на самом деле являются одной и той же строкой.
Таким образом, двумерный список нельзя создавать при помощи операции повторения одной строки. Что же делать?
Первый способ: сначала создадим список из n элементов (для начала просто из n нулей). Затем сделаем каждый элемент списка ссылкой на другой одномерный список из m элементов:
a = [0] * n for i in range(n): a[i] = [0] * m
Другой (но похожий) способ: создать пустой список, потом n раз добавить в него новый элемент, являющийся списком-строкой:
a = [] for i in range(n): a.append([0] * m)
Но еще проще воспользоваться генератором: создать список из n элементов, каждый из которых будет списком, состоящих из m нулей:
a = [[0] * m for i in range(n)]
В этом случае каждый элемент создается независимо от остальных (заново конструируется список [0] * m для заполнения очередного элемента списка), а не копируются ссылки на один и тот же список.
Ввод списка
Пусть программа получает на вход двумерный массив, в виде n строк, каждая из которых содержит m чисел, разделенных пробелами. Как их считать? Например, так:
a = [] for i in range(n): a.append(list(map(int, input().split())))
Или, без использования сложных вложенных вызовов функций:
a = [] for i in range(n): row = input().split() for i in range(len(row)): row[i] = int(row[i]) a.append(row)
Можно сделать то же самое и при помощи генератора:
a = [list(map(int, input().split())) for i in range(n)]
Сложный пример обработки массива
Пусть дан квадратный массив из n строк и n столбцов. Необходимо элементам, находящимся на главной диагонали, проходящей из левого верхнего угла в правый нижний (то есть тем элементам a[i][j] , для которых i == j ) присвоить значение 1 , элементам, находящимся выше главной диагонали – значение 0, элементам, находящимся ниже главной диагонали – значение 2. То есть получить такой массив (пример для n==4 ):
1 0 0 0 2 1 0 0 2 2 1 0 2 2 2 1
Рассмотрим несколько способов решения этой задачи. Элементы, которые лежат выше главной диагонали – это элементы a[i][j] , для которых i < j , а для элементов ниже главной диагонали i >j . Таким образом, мы можем сравнивать значения i и j и по ним определять значение a[i][j] . Получаем следующий алгоритм:
for i in range(n): for j in range(n): if i < j: a[i][j] = 0 elif i >j: a[i][j] = 2 else: a[i][j] = 1
Данный алгоритм плох, поскольку выполняет одну или две инструкции if для обработки каждого элемента. Если мы усложним алгоритм, то мы сможем обойтись вообще без условных инструкций.
Сначала заполним главную диагональ, для чего нам понадобится один цикл:
for i in range(n): a[i][i] = 1
Затем заполним значением 0 все элементы выше главной диагонали, для чего нам понадобится в каждой из строк с номером i присвоить значение элементам a[i][j] для j = i+1 , . n-1 . Здесь нам понадобятся вложенные циклы:
for i in range(n): for j in range(i + 1, n): a[i][j] = 0
Аналогично присваиваем значение 2 элементам a[i][j] для j = 0 , . i-1 :
for i in range(n): for j in range(0, i): a[i][j] = 2
Можно также внешние циклы объединить в один и получить еще одно, более компактное решение:
for i in range(n): for j in range(0, i): a[i][j] = 2 a[i][i] = 1 for j in range(i + 1, n): a[i][j] = 0
А вот такое решение использует операцию повторения списков для построения очередной строки списка. i -я строка списка состоит из i чисел 2 , затем идет одно число 1 , затем идет n-i-1 число 0 :
for i in range(n): a[i] = [2] * i + [1] + [0] * (n - i - 1)
А можно заменить цикл на генератор:
a = [[2] * i + [1] + [0] * (n - i - 1) for i in range(n)]
Форматирование вывода
В некоторых заданиях этого листка требуется выводить элементы списка аккуратными столбцами, выравнивая числа по правому краю с фиксированной шириной столбца. Это можно сделать разными способами, один из способов: использование метода rjust .
rjust — метод объекта типа str , принимающий два параметра: длину новой строки (ширина поля вывода) и символ-заполнитель: rjust(n, ch) . Например, s.rjust(10, ‘.’) . Метод возвращает новую строку, длина которой равна n символов, исходная строка находится в конце результата (то есть исходная строка “выравнивается” по правому краю), лишние позиции заполняются символом ch. Если опустить ch, то в качестве символа-заполнителя используется пробел. Если длина исходной строки была больше n, то возвращается исходная строка без изменений (строка не обрезается).
Аналогично есть методы ljust , выравнивающий строку по левому краю и center , выравнивающий строку по центру результата.
Python-сообщество
- Начало
- » Python для экспертов
- » Вывод каждого элемента списка, кортежа с новой строки
#1 Март 17, 2008 22:40:14
pythboa От: Зарегистрирован: 2008-03-17 Сообщения: 26 Репутация: 0 Профиль Отправить e-mail
Вывод каждого элемента списка, кортежа с новой строки
Когда пользуешься функциями вроде dir(), locals(), sys.path и информации выводится много, бывает нагляднее, чтобы каждый элемент выводился с новой строки, а не одной сплошной. Как это можно сделать?
#2 Март 17, 2008 22:48:32
shiza От: Зарегистрирован: 2007-07-03 Сообщения: 1073 Репутация: 0 Профиль Отправить e-mail
Вывод каждого элемента списка, кортежа с новой строки
Тока это в голову приходит =)
for x in locals().copy():
print x
Отредактировано (Март 17, 2008 22:49:19)
#3 Март 17, 2008 22:58:11
pythboa От: Зарегистрирован: 2008-03-17 Сообщения: 26 Репутация: 0 Профиль Отправить e-mail
Вывод каждого элемента списка, кортежа с новой строки
Получилось, спасибо! А одной строкой не получится?
#4 Март 17, 2008 23:07:46
pythboa От: Зарегистрирован: 2008-03-17 Сообщения: 26 Репутация: 0 Профиль Отправить e-mail
Вывод каждого элемента списка, кортежа с новой строки
О, и одной строкой получилось:
for x in locals(): print x
Меня просто .copy() смутило, но это чтобы не внести изменений ненароком, а аккуратно можно и без .copy(), да?
#5 Март 17, 2008 23:50:51
shiza От: Зарегистрирован: 2007-07-03 Сообщения: 1073 Репутация: 0 Профиль Отправить e-mail
Вывод каждого элемента списка, кортежа с новой строки
С dir() и sys.path прокатит и без copy.
А вот с locals() — на моем питоне (2.5.1) — он ругается: “RuntimeError: dictionary changed size during iteration”
#6 Март 18, 2008 00:36:19
pythboa От: Зарегистрирован: 2008-03-17 Сообщения: 26 Репутация: 0 Профиль Отправить e-mail
Вывод каждого элемента списка, кортежа с новой строки
Мне такой ошибки не даёт (винда, интерактив):
sys.version
2.5 (r25:51908, Sep 19 2006, 09:52:17)
dictionary changed size during iteration – от самой команды меняться ему вроде не с чего, может словарь locals() меняет что-то другое, да так быстро, что не успевает пройти цикл print по всем элементам словаря? (просто гадаю)
for x in __builtins__.__dict__: print x
— пример полезости построчного вывода 🙂 иначе завалило бы.
# поподробнее: ключи + значения
for x in __builtins__.__dict__.items(): print x
Вообще можно модуль такой себе представить: вызываешь с именем объекта, он создает текущую копию, идентифицирует его и предлагает доступные опции отображения; для словарей, списков и т.д. они будут разные. Напр., locals(): вам построчно или одной строкой? А по имени отсортировать? Экспортируемые скрыть нафиг? и т.д. Может даже есть уже где-нибудь.
Отредактировано (Март 18, 2008 00:41:48)
