2016-11-01 79 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忽略第一次出现,而是返回最后一行的行和列?

代码:

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

从年底开始,往回走:

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

你的算法的问题是,你正在返回的FAS为您找到的元素的第一次出现。

所以,你应该做的是,当你发现j==symbol保存两个指标,并保持所有的循环后继续运行你的矩阵

,你将有你的符号的最后一次出现..

或者,第二种方法是,从结尾开始,运行逆矩阵,在这种情况下,您可以返回第一个出现的地址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

如果你想为每个字符位置,你可以做一个衬垫与字典理解:

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)} 
相关问题