Нахождение последнего появления символа в списке списков

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

Example: 

lst = [['.','.','.','e'],
       ['A','A','.','e'],
       ['.','.','.','e'],
       ['.','X','X','X'],
       ['.','.','.','.'],
       ['.','y','Z','Z']]

#For this list of lists the function should return (5,3) for Z since it is in the 6th list, 
#and is the 6th value (python starts the count at 0) and for X it should return (3,3)

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

Код:

def get_far_end(symbol,lot):
    for i in range(len(lot)):
        for j in lot[i]:
            if j == symbol:
                return i ,lot[i].index(j)   

4 ответа

Решение

Начните с конца и идите назад:

def get_far_end(symbol,lot):
    for i in range(len(lot)-1,-1,-1):
        for j in range(len(lot[i])-1,-1,-1):
            if lot[i][j] == symbol:
                return i ,j
    return None   

Я предполагаю, что вы заинтересованы в любом персонаже, кроме ".". Если это так, то вы можете сделать это, используя словарь следующим образом:

lst = [['.','.','.','e'],
       ['A','A','.','e'],
       ['.','.','.','e'],
       ['.','X','X','X'],
       ['.','.','.','.'],
       ['.','y','Z','Z']]

out_dict = {}

for i in range(len(lst)):
        for j in range(len(lst[i])):
            if lst[i][j] is not '.':
                out_dict[lst[i][j]] = [i,j]


print(out_dict)
# {'Z': [5, 3], 'y': [5, 1], 'X': [3, 3], 'A': [1, 1], 'e': [2, 3]}

Если вам нужна позиция для каждого персонажа, вы можете сделать один вкладыш с пониманием dict:

lst = [['.','.','.','e'],
       ['A','A','.','e'],
       ['.','.','.','e'],
       ['.','X','X','X'],
       ['.','.','.','.'],
       ['.','y','Z','Z']]

res = {c: (i, j) for i, sub in enumerate(lst) for j, c in enumerate(sub) if c != '.'}
print(res)

Выход:

{'A': (1, 1), 'X': (3, 3), 'Z': (5, 3), 'e': (2, 3), 'y': (5, 1)}

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

Так что вы должны сделать, когда вы найдете j==symbol сохраните оба индекса и продолжайте рутину вашей матрицы

после всех циклов у вас будет последнее вхождение вашего символа..

Или, второй подход, начинается с конца и запускает обратную матрицу, в этом случае вы можете вернуть первый случай j==symbol

Другие вопросы по тегам