[英]How to get the 2d coordinates(x,y) from an ordered 1d list - 0,1,2,3,4,5,6… with given width & height?
[英]Iterate 2D list from a given point (x,y)
我有一个二维列表(矩阵),我想在其中将 function 应用于某个 position 之后的所有元素,或者执行一些搜索。
示例:从列表中的点(1,2)
开始
[
[1,2,3,4]
[5,6,7,8]
[9,10,11,12]
]
意味着我们要从数字7
开始迭代并跳过第一行和第二行的前两个元素。
我可以从头开始并检查我何时领先于点 (x,y) 的元素并且之前什么都不做,但基本上我的想法是如果 2D 列表(矩阵)更大,则保存一些迭代周期。
我尝试更改第一次迭代的迭代变量(例如我在 C++ 中所做的那样),但失败了:
flag = True
for i in range(height):
for j in range(width):
if flag:
i = x
j = y
flag = False
...
此脚本将 function(打印)应用于 starting_i 和 starting_j 坐标之后的所有元素。
m = [[1,2,3,4], [5,6,7,8,9], [10,11,12,13]]
starting_i = 1
starting_j = 2
for i in range(starting_i, len(m)):
for j in range(starting_j, len(m[i])):
# apply your function here
print(m[i][j])
starting_j = 0
Output:
7 8 9 10 11 12 13
您的方法失败,因为i = x
和j = y
仅适用于该迭代(第 i 个或第 j 个)。 然后他们将被切换到range
的下一个数字
尽管您仍然可以使用if flag
实现此目的,但我为您提供了一种更方便的方法,即列表切片。 如果你有一个列表a = [1, 2, 3, 4]
那么a[2:]
将返回[3, 4]
因此,您可以通过以下方式将其应用于您的2D
列表
a = [[1, 2, 3, 4], [6, 7, 8, 9], [10, 11, 12, 13]]
startRow = 1
startCol = 2
for col in a[startRow][startCol:]: # You only need to slice the `startRow`
print(col)
for row in a[startRow+1:]: # Now loop through all the remaining rows starting at the next row of startRow
for col in row:
print(col)
您可以遍历不完整行的其余部分,然后继续遍历从 i + 1 开始的完整行,如下所示:
def iterate_from(i,j):
for k in range(j, width):
perform(i,k)
for l in range(i+1, height)
for k in range(width):
perform(l,k)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.