2016-11-01 3 views
0

Я пишу функцию, которая должна возвращать строку и столбец последнего вхождения определенного символа в список списков. Если символ отсутствует в списке списков, функция должна вернуть 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 игнорировать первые вхождения и вместо этого возвращать строку и col последнего?

Код:

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) 
+1

Начните с конца и шаг назад, первое, что вы найдете, будет последним в вашем списке. – Knells

ответ

1

Start от конца и идти в обратном направлении:

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 
+0

Спасибо, каждый совет помог, но ваш пример вернет одну пару координат для каждого символа правильно – n00bprogrammer22

0

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

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

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

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

0

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

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]} 
0

Если вы хотите позицию для каждого символа вы можете сделать один лайнер с 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)} 
Смежные вопросы