Практические приемы чтения массивов на Python
Ввод массивов в Python: обзор подходов
Как наиболее эффективно ввести одномерный массив чисел?
Самым распространенным и производительным способом является чтение строки с последующей разбивкой и преобразованием типов с помощью list comprehension и map:
# Ввод целых чисел через пробел
arr = list(map(int, input().split()))
print(arr)ввод массивов python (ввод массивов в python)
Пример работы:
Ввод: 1 2 3 4 5 Вывод: [1, 2, 3, 4, 5]
Этот метод обрабатывает любое количество чисел, игнорирует лишние пробелы и символы перевода строки. Преимущества: компактность, скорость (встроенная функция map работает на C-уровне), безопасность (нет eval).
Как ввести массив с помощью цикла for и append?
Если необходимо вводить элементы поэлементно (например, каждый на новой строке), используется цикл:
n = int(input("Количество элементов: "))
arr = []
for _ in range(n):
arr.append(int(input()))
print(arr)Когда применять: когда количество элементов известно заранее, а ввод происходит через диалог с пользователем.
Типичная ошибка: если число введено неправильно (не целое), программа упадет с ValueError. Для надежности стоит обернуть преобразование в try/except.
Как ввести массив, используя eval для полного списка?
Можно попросить пользователя ввести список целиком в синтаксисе Python:
arr = eval(input("Введите список: "))
print(arr)Огромная опасность: eval выполняет любой введенный код, что создает риск безопасности. Рекомендуется использовать только в учебных целях или при полном доверии к источнику данных.
Как ввести массив чисел с плавающей точкой из одной строки?
Достаточно заменить int на float:
arr = list(map(float, input().split()))
print(arr)Как ввести двумерный массив (матрицу)?
Классический способ – построчное считывание с разбиением:
rows = int(input("Количество строк: "))
cols = int(input("Количество столбцов: "))
matrix = []
for i in range(rows):
row = list(map(int, input().split()))
matrix.append(row)
print(matrix)Если размер матрицы известен, можно использовать вложенные генераторы:
matrix = [list(map(int, input().split())) for _ in range(int(input()))]
print(matrix)Проблема: количество чисел в строке может не совпадать с ожидаемым количеством столбцов. Необходимо проверять длину введенной строки и при необходимости дополнять или обрезать.
Как ввести массив из файла?
Для ввода из текстового файла, где числа разделены пробелами или переводами строк, используется чтение всего содержимого и обработка:
with open('data.txt', 'r') as f:
data = f.read().split()
arr = list(map(int, data))
print(arr)Этот способ подходит для больших объемов данных, так как файл читается один раз.
Как ввести массив с помощью sys.stdin.read для ускорения?
При многократных запросах ввода в соревновательных задачах используют sys.stdin.read для чтения всех данных сразу:
import sys
data = sys.stdin.read().split()
arr = list(map(int, data))
print(arr)Эффективность возрастает за счет уменьшения количества вызовов input().
Важно: после первого вызова sys.stdin.read() остальные вызовы input() вернут пустую строку, поэтому этот метод применяют для однократного чтения.
Как ввести массив, используя array.array для экономии памяти?
Модуль array предоставляет компактное представление чисел. Пример для целых чисел типа 'i':
from array import array
arr = array('i', map(int, input().split()))
print(arr)Array занимает меньше памяти, чем list, и хранит однородные данные.
Как ввести массив с использованием NumPy для научных расчетов?
Если проект использует NumPy, удобно применять numpy.fromstring или numpy.loadtxt:
import numpy as np
arr = np.fromstring(input(), dtype=int, sep=' ')
print(arr)Для файлов:
arr = np.loadtxt('data.txt', dtype=int)
print(arr)NumPy автоматически определяет размерность, если данные многомерные.
Расширенные примеры ввода массивов
Ниже приведены нестандартные или редко используемые методы, которые могут оказаться полезными в специфических ситуациях.
Ввод массива с произвольным разделителем (регулярные выражения)
Если разделитель не пробел, а, например, запятая с пробелом или несколько символов, можно применить re.split:
import re
# Ввод: 12, 34, 56, 78
text = input()
arr = list(map(int, re.split(r'[,;]\s*', text)))
print(arr)Вывод: [12, 34, 56, 78]
Ввод массива с проверкой корректности каждого элемента
Функция с генератором, которая запрашивает повторный ввод при ошибке:
def input_array(prompt="Введите числа: "):
while True:
line = input(prompt).strip()
if not line:
print("Строка пуста. Повторите ввод.")
continue
try:
return [int(x) for x in line.split()]
except ValueError:
print("Обнаружены нечисловые символы. Попробуйте снова.")
arr = input_array()
print(arr)Ввод массива из нескольких строк с чтением до конца ввода (Ctrl+Z / Ctrl+D)
Для чтения многострочного ввода, когда количество строк неизвестно, используется цикл с проверкой на EOF:
import sys
arr = []
for line in sys.stdin:
line = line.strip()
if line:
arr.extend(map(int, line.split()))
print(arr)Такой подход часто применяется в консольных утилитах и пайплайнах.
Ввод массива и его сортировка в одной строке с лямбдой
arr = sorted(map(int, input().split()), key=lambda x: x % 10)
print(arr)Это не столько ввод, сколько совмещение операций, но демонстрирует гибкость Python.
Ввод массива с использованием декоратора для валидации
def validate_int_list(func):
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
if not all(isinstance(x, int) for x in result):
raise TypeError("Элементы не являются целыми числами")
return result
return wrapper
@validate_int_list
def read_array():
return list(map(int, input().split()))
try:
arr = read_array()
print(arr)
except TypeError as e:
print("Ошибка:", e)Ввод разреженного массива в формате (индекс, значение)
# Ввод: 0:10, 3:20, 5:30
line = input()
pairs = [pair.split(':') for pair in line.split(',')]
sparse = {int(k): int(v) for k, v in pairs}
print(sparse) # {0: 10, 3: 20, 5: 30}Ввод массива через командную строку (argparse)
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--arr', nargs='*', type=int, help='Массив чисел')
args = parser.parse_args()
print(args.arr)Запуск: python script.py --arr 1 2 3 4
Ввод многомерного массива с автоматическим определением размерности
import numpy as np
# Ввод: 1 2 3; 4 5 6; 7 8 9
lines = input().split(';')
matrix = np.array([list(map(int, line.split())) for line in lines])
print(matrix)Используя точку с запятой как разделитель строк.