• 1
    Ввод и вывод данных
    • Задачи
  • 2
    Условия
    • Задачи
  • 3
    Цикл for
    • Задачи
  • 4
    Строки
    • Задачи
  • 5
    Цикл while
    • Задачи
  • 6
    Списки
    • Задачи
  • 7
    Двумерные массивы
    • Задачи
  • 8
    Словари
    • Задачи
  • 9
    Множества
    • Задачи
  • 10
    Функции и рекурсия
    • Задачи
  • к

Занятие 7. Двумерные массивы

Уровень сложности:

иконка человека красный иконка человека белая иконка человека зеленая Pythonlib

Задача«Самый жаркий день»

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

Формат ввода

Сначала вводится число N (1 ≤ N ≤ 100) - количество районов в городе.
Затем для каждого района вводится строка, содержащая 7 целых чисел, разделённых пробелами. Эти числа представляют собой температуру в данном районе каждый день недели (от понедельника до воскресенья). Температура измеряется в градусах Цельсия и может быть любым целым числом от -50 до +50

Формат Вывода

Для каждого района выведите одно целое число - максимальную температуру в этом районе в течение недели

Пример

Ввод

2
20 22 25 23 21 24 26
15 16 14 17 18 19 20

Вывод

26
20

Подсказка

Вложенные циклы и работа с двумерными массивами

Циклы в цикле, или вложенные циклы, являются фундаментальным инструментом в программировании. Они позволяют не только итерировать по многомерным структурам данных, таким как таблицы или матрицы, но и решать широкий спектр задач, где требуется многократное повторение одного и того же действия внутри другого повторяющегося процесса. Представьте себе перебор всех квартир в многоэтажном доме: сначала вы выбираете этаж (внешний цикл), а затем обходите все квартиры на этом этаже (внутренний цикл).

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

Основные принципы работы вложенных циклов:

  1. Запуск внешнего цикла: Внешний цикл запускается и выполняет свою первую итерацию.
  2. Полный проход внутреннего цикла: Внутренний цикл активируется и выполняет полный набор своих итераций.
  3. Следующая итерация внешнего цикла: Внешний цикл переходит к своей следующей итерации, после чего внутренний цикл снова запускается и выполняет полный набор своих итераций.
  4. Повторение: Этот процесс повторяется, пока внешний цикл не завершит все свои итерации.

Полезный совет: Отличная аналогия для понимания вложенных циклов — это часы. Внешний цикл — это часовая стрелка, а внутренний — минутная. За один час (одна итерация внешнего цикла) минутная стрелка (внутренний цикл) успевает сделать полный оборот (все свои итерации).

Пример работы вложенных циклов

Рассмотрим классический пример: перебор всех элементов в двумерном массиве (списке списков).

matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

# Внешний цикл по строкам (по индексам)
for i in range(len(matrix)):
    # Внутренний цикл по элементам строки (по индексам)
    for j in range(len(matrix[i])):
        print(matrix[i][j], end=' ')
    print()  # Переход на новую строку после вывода всех элементов текущей строки

Разбор по шагам:

  1. Инициализация внешнего цикла: Переменная i (индекс строки) начинает с 0. Внешний цикл входит в свое тело.
  2. Инициализация внутреннего цикла: Переменная j (индекс столбца) начинает с 0. Внутренний цикл выполняет полный набор итераций для первой строки (matrix[0]), перебирая все её элементы.
  3. Вывод элементов первой строки: Внутренний цикл последовательно выводит 1, 2, 3.
  4. Завершение внутреннего цикла: Когда внутренний цикл закончил работу со строкой matrix[0], управление возвращается к внешнему циклу.
  5. Следующая итерация внешнего цикла: i становится равным 1. Внешний цикл снова запускает внутренний, который теперь будет работать со второй строкой (matrix[1]).
  6. Вывод элементов второй строки: Внутренний цикл выводит 4, 5, 6.
  7. Этот процесс повторяется для всех строк матрицы.

Совет по стилю: Хотя итерация по индексам (range(len(...))) абсолютно корректна и часто необходима, в Python существует более читаемый и "пайтонический" способ перебора элементов:

for row in matrix: # Внешний цикл напрямую берет каждую строку
    for element in row: # Внутренний цикл берет каждый элемент из текущей строки
        print(element, end=' ')
    print()

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

Двумерные массивы

В Python нет встроенного типа "двумерный массив", как в некоторых других языках. Вместо этого используется чрезвычайно гибкая структура — список списков, где каждый вложенный список представляет собой строку (или ряд) массива. Рассмотрим разные способы их создания и заполнения.

1. Ручной ввод

Самый простой способ, идеален для небольших примеров, тестов и отладки.

# Пример двумерного массива 3x3
matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

2. Ввод массива через циклы

Классический и наиболее фундаментальный способ, который нужно хорошо понимать. Он дает полный контроль над процессом.

# Ввод размеров массива
rows = int(input("Введите количество строк: "))
cols = int(input("Введите количество столбцов: "))

matrix = [] # Создаем пустой список для всей матрицы

for i in range(rows):
    row = [] # Создаем пустой список для текущей строки
    for j in range(cols):
        # Запрашиваем каждый элемент
        value = int(input(f"Введите элемент [{i}][{j}]: "))
        row.append(value)
    matrix.append(row) # Добавляем заполненную строку в матрицу

3. Ввод массива с использованием list comprehension (списковых включений)

Это более компактный и продвинутый способ, который очень любят опытные Python-разработчики. Он позволяет создать сложную структуру в одну строку.

rows = 3
cols = 3

# Вся магия в одной строке
matrix = [[int(input(f"Элемент [{i}][{j}]: ")) for j in range(cols)] for i in range(rows)]

Совет: Хотя списковые включения очень мощные, не стоит ими злоупотреблять. Если логика становится слишком сложной, лучше вернуться к обычным циклам for ради читаемости кода.

4. Ввод массива из одной строки

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

# Входная строка с числами
input_string = "1 2 3 4 5 6 7 8 9"
rows, cols = 3, 3 # Мы знаем размеры заранее

# Преобразуем строку в список чисел
values = list(map(int, input_string.split()))

# "Нарезаем" одномерный список на строки нужной длины
matrix = [values[i*cols : (i+1)*cols] for i in range(rows)]

Пример задачи с двумерным массивом

Условие: Даны два двумерных массива matrix1 и matrix2 одинакового размера. Нужно создать третий массив result_matrix такого же размера, в котором каждый элемент будет равен наибольшему из элементов на соответствующих позициях в matrix1 и matrix2.

# Исходные массивы
matrix1 = [[1, 2], [3, 4]]
matrix2 = [[4, 3], [2, 1]]

# Инициализация результирующего массива размером 2x2 нулями
result_matrix = [[0 for _ in range(2)] for _ in range(2)]

# Решение 1: С использованием функции max() - самый лаконичный
for i in range(2):
    for j in range(2):
        result_matrix[i][j] = max(matrix1[i][j], matrix2[i][j])

# Вывод результата
for row in result_matrix:
    print(row)
# [4, 3]
# [3, 4]

Вы уже на том этапе, когда должны понимать, что одну и ту же задачу можно решить несколькими способами. Знание разных подходов позволяет выбирать наиболее эффективный и читаемый. Вот еще два варианта решения этой же задачи:

# Решение 2: С использованием полного условия if-else - самый понятный для новичков
for i in range(2):
    for j in range(2):
        if matrix1[i][j] > matrix2[i][j]:
            result_matrix[i][j] = matrix1[i][j]
        else:
            result_matrix[i][j] = matrix2[i][j]

# Решение 3: С использованием тернарного оператора - компактная замена if-else
for i in range(2):
    for j in range(2):
        result_matrix[i][j] = matrix1[i][j] if matrix1[i][j] > matrix2[i][j] else matrix2[i][j]

Подробное пояснение:

  • Инициализация результирующего массива: Конструкция [[0 for _ in range(2)] for _ in range(2)] создает матрицу 2x2, заполненную нулями. Внутренняя часть [0 for _ in range(2)] создает строку [0, 0]. Внешний цикл повторяет это действие 2 раза. Символ _ используется как имя переменной, значение которой нам не важно.
  • Перебор элементов: Вложенные циклы for по индексам i и j гарантируют, что мы посетим каждую ячейку [i][j] в обеих матрицах одновременно.
  • Сравнение элементов: Для каждой пары элементов matrix1[i][j] и matrix2[i][j] мы находим максимальное значение и записываем его в ту же позицию [i][j] в result_matrix. Функция max() делает это наиболее изящно, но логика с if-else абсолютно эквивалентна.

Заключительный совет: Освоение вложенных циклов и различных способов работы с матрицами — это ключ к решению огромного класса задач. Не бойтесь экспериментировать с разными подходами. Для очень больших матриц и сложных математических операций в будущем вы познакомитесь с библиотекой NumPy, которая делает такие вычисления невероятно быстрыми. Но для обучения и большинства стандартных задач подходы, описанные выше, являются идеальными.

main.py
Тест 1
Тест 2
Тест 3
Тест 4
Тест 5
Тест 6
Тест 7
Тест 8
Тест 9
Тест 10
Решение разработчика

🎉 Поздравляем! 🎉

Ты отлично справился с задачей! Это был непростой вызов, но ты нашёл правильное решение. Ты на шаг ближе к мастерству в программировании! Продолжай в том же духе, ведь каждый пройденный этап делает тебя ещё сильнее.

AD

Реклама

red-snake blue-snake green-snake

Запускаем ваш код...

Помощник ИИ

Привет! Я твой помощник по программированию. Задавай любые вопросы по Python, я могу рассказать о функциях, методах, обьяснить то, что тебе не понятно, а так же о текущей задаче!