Как вернуть индекс максимального и минимального числа в матрице?

matrix =[[2, 8, 9, 6]
    [14, 23, 7, 1]
    [3, 29, 4, 6]
    [10, 2, 11, 13]]

def max_min(mtr):
    s = []
    def min_num(matrix):
        min = matrix[0][0]
        for row in matrix:
            for num in row:
                if min > num:
                    min = num
        return min

def max_num(matrix):
    max = matrix[0][0]
    for row in matrix:
        for num in row:
            if num > max:
                max = num
    return max

s.append(min_num(mtr))
s.append(max_num(mtr))
return sorted(s)

print(max_min(matrix))

Ответы (1 шт):

Автор решения: Andy Pavlov

Могу предложить вариант через соединение списка в один, для которого потом применить sorted(). Отсюда сразу получаем минимальное число в начало и максимальное в конец.

Вариант, если нужно найти первое упоминание минимального и максимального числа в списке. На выходе список с двумя кортежами (число, индекс строки, индекс колонки):

def minmax(arr):
    # Соединяем все в один список, добавляя номер строки и колонки
    flat = sorted([(r, im, ir) for im, m in enumerate(arr) for ir, r in enumerate(m)]) 
    # Возвращаем первый элемент, как минимальный и найденное первое упоминание максимума 
    return flat[0], next(filter(lambda x: x[0] == flat[-1][0], flat))

matrix =[[2, 8, 9, 6],
    [14, 23, 7, 1],
    [3, 29, 4, 6],
    [10, 2, 11, 13]]

print(minmax(matrix))  # ((1, 1, 3), (29, 2, 1))

Либо вариант, когда длина внутренних списков одинакова. Соединяем все один список. Находим максимумы и минимумы, их индексы в новом списке, и уже индексы обратно по длине внутренних списков пересчитываем в номер строки и колонки.

def minmax(arr):
    flat = [r for m in arr for r in m]
    mn, mx = min(flat), max(flat)
    imn, imx = flat.index(mn), flat.index(mx)
    return (mn, imn // len(arr[0]), imn % len(arr[0])), \
        (mx, imx // len(arr[0]), imx % len(arr[0]))

print(minmax(matrix))  # ((1, 1, 3), (29, 2, 1))
→ Ссылка