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)   
4

4 回答 4

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   
于 2016-11-01T01:49:46.343 回答
0

你的算法的问题是你返回的速度与你找到元素的第一次出现一样快。

所以你应该做的是,当你发现j==symbol保存两个索引并继续运行你的矩阵时

在所有循环之后,您将最后一次出现您的符号..

或者,第二种方法是,从末尾开始,并运行逆矩阵,在这种情况下,您可以返回第一次出现的j==symbol

于 2016-11-01T01:47:19.030 回答
0

我假设你对任何字符感兴趣,除了'.'。如果是这样,那么您可以使用字典来执行以下操作:

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]}
于 2016-11-01T01:47:39.360 回答
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)}
于 2016-11-01T01:57:49.297 回答