Учитывая список целых чисел и матрицы со случайными целыми числами, вернуть координаты x, y для каждого элемента списка в матрице только один раз - PullRequest
0 голосов
/ 29 октября 2019

Функция должна перебирать матрицу для каждого элемента списка, если element == matrix [row_index] [element_index], добавить этот элемент в список координат, затем искать следующий элемент списка. Если он нашел координаты каждого первого элемента в матрице, возвращает список координат.

numbers = [1, 2, 3]

matrix = [[0,1,2], [3,2,0], [1,2,3]]

Я застрял с итерацией матрицы для каждого элемента в списке целых чисел.

coordinates = []

for i in numbers:
    for ri, row in enumerate(matrix):
        for ei, elem in enumerate(matrix):
            if i == matrix[ri][ei]:
                coordinates.append(ri, ei)

               # found first element ocurring first in 
                #row it should loop for the next 
                #element in given list

Ответы [ 3 ]

2 голосов
/ 29 октября 2019

Во-первых, .append() с двумя аргументами не сработает. Вы, вероятно, хотели добавить кортеж или список, состоящий из ri и ei.

. Также, пожалуйста, не используйте встроенные имена, такие как list для переменных - это сбивает с толку всех, включаяинтерпретатор.

А что касается эффективного решения вашей проблемы, было бы лучше перебрать list (здесь values_sought) не во внешнем -, а во внутреннем цикле, чтобыИзбегайте бессмысленной проверки одних и тех же координат матрицы несколько раз, например:

values_sought = [1, 2, 3]
matrix = [[0,1,2], [3,2,0], [1,2,3]]
coordinates = []

for row_index, row in enumerate(matrix):
    if not values_sought: break
    for column_index, value_present in enumerate(row):
        if not values_sought: break
        for value_sought_index, value_sought in enumerate(values_sought):
            if value_present == value_sought:
                coordinates.append((row_index, column_index))
                values_sought.pop(value_sought_index)
                break

Значения удаляются из values_sought после их обнаружения, поэтому вы можете захотеть иметь временный список для этой цели, если вам нужновсе еще имеют эти значения впоследствии.

1 голос
/ 29 октября 2019

Существует 2 решения:

  1. Используйте два break ключевых слов, как в @Vilius Klakauskas response . Здесь вы можете узнать больше об использовании else с for и break операторами.

или

Объявите функцию с return, как показано ниже:
def find(i): 
    for ri, row in enumerate(matrix): 
        for ei, elem in enumerate(row): 
            if i == matrix[ri][ei]: 
                return (ri, ei) 

и вызовите ее в цикле:

coordinates = []
for i in list: 
    coordinates.append(find(i))

coordinates output:

[(0, 1), (0, 2), (1, 0)]

0 голосов
/ 29 октября 2019

Этого можно добиться, добавив break, continue и for;else

for i in list:
    for ri, row in enumerate(matrix):
        for ei, elem in enumerate(matrix):
            #breaks out of the loop if condition is met
            if i == matrix[ri][ei]:
                coordinates.append((ri, ei))
                break 
        #if no breaks occur, continue iterating over rows
        else:
            continue
        # breaks out of the loop if first occurrence found
        break 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...