Список понимания списка (матрицы) - PullRequest
1 голос
/ 16 апреля 2020

Я пытаюсь сделать мой код более компактным. Можно ли написать приведенный ниже код в меньшем количестве строк в стиле понимания списка?

time_horizon = 4*7
number_shifts = 3

qqq = [[0 for i in range(time_horizon)] for j in range(number_shifts)]
count = 0
for i in range(time_horizon):
    for j in range(number_shifts):
        qqq[j][i] = count
        count = count+1
print(qqq)

В результате получается

[[0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81], [1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40, 43, 46, 49, 52, 55, 58, 61, 64, 67, 70, 73, 76, 79, 82], [2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 44, 47, 50, 53, 56, 59, 62, 65, 68, 71, 74, 77, 80, 83]]

Ответы [ 2 ]

2 голосов
/ 16 апреля 2020

Вот одна строка:

[[j+i for i in range(time_horizon*number_shifts) if i%number_shifts==0] for j in range(number_shifts)]

Это дает:

[[0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81], [1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40, 43, 46, 49, 52, 55, 58, 61, 64, 67, 70, 73, 76, 79, 82], [2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 44, 47, 50, 53, 56, 59, 62, 65, 68, 71, 74, 77, 80, 83]]

Согласно вашему коду (со значениями):

[[j+i for i in range(4*7*3) if i%3==0] for j in range(3)]

или немного проще:

[[j+i for i in range(0,time_horizon*number_shifts,number_shifts) ] for j in range(number_shifts)]

или:

[[j+i for i in range(0,4*7*3,3) ] for j in range(3)]
1 голос
/ 16 апреля 2020

более простой однострочный

time_horizon, number_shifts = 28, 3
qqq = [[n+t*number_shifts for t in range(time_horizon)] for n in range(number_shifts)]
print(qqq)
...