Поиск через двумерный список без NumPy - PullRequest
0 голосов
/ 31 октября 2018

Я хочу определить функцию, которая принимает два параметра: int и list.

Если функция находит в списке целое число, она возвращает свои координаты .

Например, как бы я сделал это для числа 4 в следующем списке, без использования numpy ?

l = [
         [0, 0, 0, 0, 0, 0, 0, 0, 0],
         [0, 2, 1, 1, 0, 1, 1, 1, 0],
         [0, 1, 0, 1, 0, 0, 0, 1, 0],
         [0, 1, 0, 1, 1, 1, 0, 1, 0],
         [0, 1, 0, 0, 0, 1, 0, 1, 0],
         [0, 1, 1, 1, 0, 1, 0, 1, 0],
         [0, 0, 0, 1, 0, 1, 0, 1, 0],
         [0, 1, 1, 1, 0, 1, 0, 1, 0],
         [0, 1, 0, 0, 0, 0, 0, 1, 0],
         [0, 1, 0, 1, 1, 1, 0, 1, 0],
         [0, 1, 0, 1, 0, 1, 0, 1, 0],
         [0, 1, 1, 1, 0, 1, 1, 4, 0],
         [0, 0, 0, 0, 0, 0, 0, 0, 0]
    ]

Можно предположить, что цель всегда будет отображаться только один раз и всегда будет содержаться в списке.

Ответы [ 4 ]

0 голосов
/ 31 октября 2018

Вот мой подход:

def matrix_search(target, matrix):
    for row_index, row in enumerate(matrix):
        try:
            return (row_index, row.index(target))
        except ValueError:
            pass
    raise ValueError('Target {} not found'.format(target))

Пример использования:

print(matrix_search(4, l))

Примечания

  • Для поиска в простом списке используйте метод .index()
  • Метод .index() либо возвращает индекс элемента, если он найден, либо выдает ValueError, если не найден. В нашем контексте мы просто игнорируем это исключение и переходим к следующему ряду.
  • В конце цикла мы сгенерируем исключение, потому что элемент не найден
0 голосов
/ 31 октября 2018

Я бы использовал решение так:

#!/usr/bin/env ipython
# ---------------------
l = [
         [0, 0, 0, 0, 0, 0, 0, 0, 0],
         [0, 2, 1, 1, 0, 1, 1, 1, 0],
         [0, 1, 0, 1, 0, 0, 0, 1, 0],
         [0, 1, 0, 1, 1, 1, 0, 1, 0],
         [0, 1, 0, 0, 0, 1, 0, 1, 0],
         [0, 1, 1, 1, 0, 1, 0, 1, 0],
         [0, 0, 0, 1, 0, 1, 0, 1, 0],
         [0, 1, 1, 1, 0, 1, 0, 1, 0],
         [0, 1, 0, 0, 0, 0, 0, 1, 0],
         [0, 1, 0, 1, 1, 1, 0, 1, 0],
         [0, 1, 0, 1, 0, 1, 0, 1, 0],
         [0, 1, 1, 1, 0, 1, 1, 4, 0],
         [0, 0, 0, 0, 0, 0, 0, 0, 0]
    ]
# ----------------------------------
def search(value,listin):
    coords = [[ival,kkval] for ival,dd in enumerate(listin) for kkval,val in enumerate(dd) if val==value]
    return coords
# ----------------------------------
result = search(4,l)
print result

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

0 голосов
/ 31 октября 2018

Вы можете сделать что-то вроде этого:

l = [
         [0, 0, 0, 0, 0, 0, 0, 0, 0],
         [0, 2, 1, 1, 0, 1, 1, 1, 0],
         [0, 1, 0, 1, 0, 0, 0, 1, 0],
         [0, 1, 0, 1, 1, 1, 0, 1, 0],
         [0, 1, 0, 0, 0, 1, 0, 1, 0],
         [0, 1, 1, 1, 0, 1, 0, 1, 0],
         [0, 0, 0, 1, 0, 1, 0, 1, 0],
         [0, 1, 1, 1, 0, 1, 0, 1, 0],
         [0, 1, 0, 0, 0, 0, 0, 1, 0],
         [0, 1, 0, 1, 1, 1, 0, 1, 0],
         [0, 1, 0, 1, 0, 1, 0, 1, 0],
         [0, 1, 1, 1, 0, 1, 1, 4, 0],
         [0, 0, 0, 0, 0, 0, 0, 0, 0]
    ]

def findElement(element, l):
    for i in range(len(l)):
        for j in range(len(l[i])):
            if element==l[i][j]:
                return (i,j)
    return None

print(findElement(4,l))

Выход:

(11, 7)
0 голосов
/ 31 октября 2018

Цель всегда будет отображаться только один раз и всегда будет содержаться в списке

Вы можете использовать enumerate для перечисления внешних списков и элементов внутренних списков.

def coords(lst, find):
    return next((i, j) for i, sub in enumerate(lst)
                       for j, x in enumerate(sub)
                       if x == find)

Демо с вашим списком l:

>>> coords(l, 2)
>>> (1, 1)
>>> coords(l, 1)
>>> (1, 2)

Если вы позже захотите настроить функцию для правильной работы, если цели нет в списке, помните, что next принимает необязательный аргумент default.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...