在列表列表中查找最后一次出现的字符
Finding last occurrence of a character in a list of lists
我正在编写一个函数,该函数需要 return 列表列表中某个字符最后一次出现的行和列。如果字符不在列表列表中,函数应该 return None。该函数忽略或跳过第一次出现,然后 return 将最后一次出现的行和列作为有序对。
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 忽略第一次出现,而是 return 最后一次出现的行和列?
代码:
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)
你的算法的问题是你return找到元素第一次出现的速度。
所以你应该做的是,当你找到 j==symbol
保存两个索引并继续运行你的矩阵
在所有循环之后,您将看到符号的最后一次出现..
或者,第二种方法是,从末尾开始,运行逆矩阵,在这种情况下,你可以return第一次出现j==symbol
[=12] =]
我假设您对除“.”以外的任何字符都感兴趣。如果是这样,那么您可以按如下方式使用字典:
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]}
从末尾开始倒退:
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']]
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)}
我正在编写一个函数,该函数需要 return 列表列表中某个字符最后一次出现的行和列。如果字符不在列表列表中,函数应该 return None。该函数忽略或跳过第一次出现,然后 return 将最后一次出现的行和列作为有序对。
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 忽略第一次出现,而是 return 最后一次出现的行和列?
代码:
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)
你的算法的问题是你return找到元素第一次出现的速度。
所以你应该做的是,当你找到 j==symbol
保存两个索引并继续运行你的矩阵
在所有循环之后,您将看到符号的最后一次出现..
或者,第二种方法是,从末尾开始,运行逆矩阵,在这种情况下,你可以return第一次出现j==symbol
[=12] =]
我假设您对除“.”以外的任何字符都感兴趣。如果是这样,那么您可以按如下方式使用字典:
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]}
从末尾开始倒退:
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']]
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)}