Как вывести соседние элементы элемента в матрице с условием?

Kyurem_BoG

Новичок
Пользователь
Янв 10, 2021
5
0
1
Дана матрица. Напечатать те ее элементы, все соседи которых по горизонтали, вертикали и диагонали: а) больше этого элемента, б) меньше этого элемента. Как мне указать в условии что надо выводить только те которые меньше или больше элемента
Python:
import random
def start():
        print("Дана матрица")       
        def creatArray():
            r = 0
            print('Input first index matrix: ')
            x = int(input())
            print('Input second index matrix: ')
            y = int(input())
            array = []
            for i in range(x):
                array.append([])
                for j in range(y):
                    array[i].append(random.randint(0,100))
                    r += 1 
            return array
        g= creatArray()
        def printMatrix(g):
           for row in g:
              for x in row:
                  print ( "{:3d}".format(x), end = "" )
              print ()
        printMatrix (g)
        print("Выбирите a или b")
        a= input()       
        if a == "a":
                def in_bounds(i, j, g):
                        return 0 <= i < len(g) and 0 <= j < len(g[0])
                def neighbors(g):
                        return [[g[i + di][j + dj] for di in (-1, 0, 1) for dj in (-1, 0, 1) if in_bounds(i + di, j + dj, g) and (di != 0 or dj != 0)]
                                for i in range(len(g)) for j in range(len(g[0]))]
                print(neighbors(g))
                #именно эта часть,  выводит соседние элементы каждого элемента.
                #но нужно сделать так чтобы выводила только те которые больше либо меньше этого элемента
 
        elif a == "b":
            s = 0
            for row in matrix:
               s += sum(row) #просто заглушка
            print (s)
        else:
            print('Other')
start()
while True:
    flag = input('Ещё раз? [да/нет]: ')
 
    if flag == 'да':
            start()
    else:
        break
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Вы меня неправильно поняли.
Первоначально в задании было написано:
Дана матрица. Напечатать те ее элементы,
Есть допустим элемент 97, у него есть три соседа (100, 1, 98) Должно вывести только (100 и 98) и так для каждого из 9ти элементов
Тут нужно другое условие:
Python:
def neighbors(g):
    return [
        [
            g[i + di][j + dj]
            for di in (-1, 0, 1)
            for dj in (-1, 0, 1)
            if in_bounds(i + di, j + dj, g) and (di != 0 or dj != 0)
            and g[i + di][j + dj] > g[i][j]
        ]
        for i in range(len(g))
        for j in range(len(g[0]))               
    ]
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Как мне указать в условии что надо выводить только те которые меньше или больше элемента
Добавить условие в list comprehension:
Python:
def neighbors(g):
    return [
        g[i][j]
        for i in range(len(g))
        for j in range(len(g[0]))
        if all(
        [
            g[i][j] > g[i + di][j + dj]
            for di in (-1, 0, 1)
            for dj in (-1, 0, 1)
            if in_bounds(i + di, j + dj, g) and (di != 0 or dj != 0)
        ])
    ]
 

Kyurem_BoG

Новичок
Пользователь
Янв 10, 2021
5
0
1
Добавить условие в list comprehension:
Python:
def neighbors(g):
    return [
        g[i][j]
        for i in range(len(g))
        for j in range(len(g[0]))
        if all(
        [
            g[i][j] > g[i + di][j + dj]
            for di in (-1, 0, 1)
            for dj in (-1, 0, 1)
            if in_bounds(i + di, j + dj, g) and (di != 0 or dj != 0)
        ])
    ]
С данным изменением у меня просто выводятся рандомные числа из матрицы.
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
С данным изменением у меня просто выводятся рандомные числа из матрицы.
Не рандомные, а те которые больше всех своих соседей.
 

Kyurem_BoG

Новичок
Пользователь
Янв 10, 2021
5
0
1
Не рандомные, а те которые больше всех своих соседей.
Вы меня неправильно поняли. Есть допустим элемент 97, у него есть три соседа (100, 1, 98) Должно вывести только (100 и 98) и так для каждого из 9ти элементов. А нет извиняюсь, я не так интерпретировал условие.
 

Kyurem_BoG

Новичок
Пользователь
Янв 10, 2021
5
0
1
Вы меня неправильно поняли. Есть допустим элемент 97, у него есть три соседа (100, 1, 98) Должно вывести только (100 и 98) и так для каждого из 9ти элементов
Первоначально в задании было написано:


Тут нужно другое условие:
Python:
def neighbors(g):
    return [
        [
            g[i + di][j + dj]
            for di in (-1, 0, 1)
            for dj in (-1, 0, 1)
            if in_bounds(i + di, j + dj, g) and (di != 0 or dj != 0)
            and g[i + di][j + dj] > g[i][j]
        ]
        for i in range(len(g))
        for j in range(len(g[0]))              
    ]
Понял, спасибо за оба решения, я не правильно понял условие
 

Форум IT Специалистов