1

Я хочу назначить значения столбцов массива 2d для повторяющегося диапазона.
Например, диапазон будет составлять от 1 до :Как назначить столбец в 2d-массиве для некоторого повторяющегося диапазона с помощью Python?

[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] 

Не получается. Это началось хорошо, но во 2-м повторении это провалилось.


Что не так с логикой? Если есть более простой подход, я надеюсь, что вы поделитесь им.

ответ

2

проблема с логикой в ​​том, что, когда вы дойдете до конца 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) 
3

Посмотрите на стандартный библиотечный модуль 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