Добавить многомерный список в цикл for, где индексы меняются с итерацией цикла

#python #arrays #list #for-loop #indexing

#python #массивы #Список #for-цикл #индексирование

Вопрос:

Я хотел бы создать список, в который на каждой итерации помещается новое значение. Список должен иметь размеры 3×4 (3 строки, 4 столбца). Я хочу повторить x, и для каждого x список должен быть заполнен вертикально тремя значениями. (Таким образом, когда x = 1, я хотел бы заполнить первую позицию индекса [1, 1] списка значением percentage_a. затемpercentage_b должен заполнить столбец 1 (поскольку x по-прежнему равен 1) и строку 2. То же самое для percentage_c для столбца 1, строки 3). Затем x увеличивается на единицу, и второй столбец списка должен быть заполнен и так далее. У меня есть следующий код:

 list = []

for x in range(1, 4)
    a = 2
    b = 1
    c = 1
    sum = 4
    percentage_a = a / 4
    percentage_b = b / 4
    percentage_c = c / 4
    list.insert([x, 1], int(percentage_a))
    list.insert([x, 2], int(percentage_b))
    list.insert([x, 3], int(percentage_c))
        

  

Я бы хотел получить такой результат:

 [0.5 0.5 0.5 0.5
0.25 0.25 0.25 0.25
0.25 0.25 0.25 0.25]
  

Я открыт для этого любым способом (list, numpy)

Ответ №1:

Использование вложенных списков:

Каждый внутренний список представляет собой одну строку. В Python и большинстве других языков программирования индекс массивов / списков / и т.д. начинается с 0, а не с 1.

 l = [[],[],[]]

a = 2
b = 1
c = 1
percentage_a = a / 4
percentage_b = b / 4
percentage_c = c / 4

for i in range(4):
    l[0].append(percentage_a)
    l[1].append(percentage_b)
    l[2].append(percentage_c)
  

Результатом l тогда будет:

 [[0.5, 0.5, 0.5, 0.5],
 [0.25, 0.25, 0.25, 0.25],
 [0.25, 0.25, 0.25, 0.25]]
  

Ответ №2:

Вы можете сделать что-то вроде этого

 import numpy as np

a = 2
b = 1
c = 1
percentage_a = a / 4
percentage_b = b / 4
percentage_c = c / 4

## Option 1
l = np.empty(shape=(3,4))
for x in range(4):
    l[:,x]=[percentage_a,percentage_b,percentage_c]

## Option 2, a bit shorter
l = np.array([[percentage_a,percentage_b,percentage_c] for i in range(4)]).T
  

Это возвращает 2D массив numpy

 array([[0.5 , 0.5 , 0.5 , 0.5 ],
       [0.25, 0.25, 0.25, 0.25],
       [0.25, 0.25, 0.25, 0.25]])
  

Обратите внимание, вы можете преобразовать его в список списков, используя l.tolist() или сгладить свой вывод до единого списка, используя l.flatten() в зависимости от того, что вам действительно нужно.