如何使用 Python 将二维数组中的列分配给某个重复范围?
How to assign a column in 2d-array to some repetitive range using Python?
我想将二维数组的列值分配给重复范围。
例如,范围将从 1 到 3:
[1, 0, 0]
[2, 0, 0]
[3, 0, 0]
[1, 0, 0]
[2, 0, 0]
[3, 0, 0]
我有代码:
width, height = 3, 6
array2d = [[0 for x in range(width)] for y in range(height)]
repRange = list(range(1,4)) #it is [1, 2, 3]
j = 0
for i in range(height):
array2d[i][0] = repRange[j]
if j >= len(repRange)-1:
j = 0
j += 1
for row in array2d:
print(row)
输出:
[1, 0, 0]
[2, 0, 0]
[3, 0, 0]
[2, 0, 0]
[3, 0, 0]
[2, 0, 0]
失败了。开始很好,但在第二次重复时失败了。
逻辑有什么问题?如果有更简单的方法,希望大家分享。
看看标准库模块itertools。函数 cycle
做你想做的事:
from itertools import cycle
width, height = 3, 6
array2d = [[0 for x in range(width)] for y in range(height)]
for l, i in zip(array2d, cycle([1,2,3])):
l[0] = i
您的逻辑问题在于,当您到达 repRange
的末尾时,您将 j
设置为 1 而不是 0。发生这种情况是因为 j += 1
在if
声明; if
语句中的测试也需要调整。这是您的代码的修复版本。
width, height = 3, 6
array2d = [[0 for x in range(width)] for y in range(height)]
repRange = list(range(1, 4)) #it is [1, 2, 3]
j = 0
for i in range(height):
array2d[i][0] = repRange[j]
j += 1
if j >= len(repRange):
j = 0
for row in array2d:
print(row)
输出
[1, 0, 0]
[2, 0, 0]
[3, 0, 0]
[1, 0, 0]
[2, 0, 0]
[3, 0, 0]
这是一个更紧凑的版本。
from itertools import cycle
width, height = 3, 6
repRange = cycle(range(1, 4))
zeroes = [0] * (width - 1)
array2d = [[next(repRange)] + zeroes for y in range(height)]
for row in array2d:
print(row)
还有一个:
from itertools import cycle
width, height = 3, 6
zeroes = [0] * (width - 1)
array2d = [[v] + zeroes for _, v in zip(range(height), cycle(range(1, 4)))]
for row in array2d:
print(row)
我想将二维数组的列值分配给重复范围。
例如,范围将从 1 到 3:
[1, 0, 0]
[2, 0, 0]
[3, 0, 0]
[1, 0, 0]
[2, 0, 0]
[3, 0, 0]
我有代码:
width, height = 3, 6
array2d = [[0 for x in range(width)] for y in range(height)]
repRange = list(range(1,4)) #it is [1, 2, 3]
j = 0
for i in range(height):
array2d[i][0] = repRange[j]
if j >= len(repRange)-1:
j = 0
j += 1
for row in array2d:
print(row)
输出:
[1, 0, 0]
[2, 0, 0]
[3, 0, 0]
[2, 0, 0]
[3, 0, 0]
[2, 0, 0]
失败了。开始很好,但在第二次重复时失败了。
逻辑有什么问题?如果有更简单的方法,希望大家分享。
看看标准库模块itertools。函数 cycle
做你想做的事:
from itertools import cycle
width, height = 3, 6
array2d = [[0 for x in range(width)] for y in range(height)]
for l, i in zip(array2d, cycle([1,2,3])):
l[0] = i
您的逻辑问题在于,当您到达 repRange
的末尾时,您将 j
设置为 1 而不是 0。发生这种情况是因为 j += 1
在if
声明; if
语句中的测试也需要调整。这是您的代码的修复版本。
width, height = 3, 6
array2d = [[0 for x in range(width)] for y in range(height)]
repRange = list(range(1, 4)) #it is [1, 2, 3]
j = 0
for i in range(height):
array2d[i][0] = repRange[j]
j += 1
if j >= len(repRange):
j = 0
for row in array2d:
print(row)
输出
[1, 0, 0]
[2, 0, 0]
[3, 0, 0]
[1, 0, 0]
[2, 0, 0]
[3, 0, 0]
这是一个更紧凑的版本。
from itertools import cycle
width, height = 3, 6
repRange = cycle(range(1, 4))
zeroes = [0] * (width - 1)
array2d = [[next(repRange)] + zeroes for y in range(height)]
for row in array2d:
print(row)
还有一个:
from itertools import cycle
width, height = 3, 6
zeroes = [0] * (width - 1)
array2d = [[v] + zeroes for _, v in zip(range(height), cycle(range(1, 4)))]
for row in array2d:
print(row)