#python
#python
Вопрос:
У меня есть список списков (количество списков, которое создается при каждом запуске кода, передается в качестве аргумента), и в каждом списке мне нужно выполнить итерацию по элементам каждого из вторых списков в x количестве списков.
Упрощенный формат будет:
list = [[[1, 2, 3], [4, 5, 6]], [[1, 2, 3], [7, 8, 9]], [[1, 2, 3], [10, 11, 12]]]
И мне нужно выполнить итерацию по списку, выполняя (4 7 10), (5 8 11) и (6 9 12 ).
Я не добился большого прогресса в кодировании этого, на данный момент я просто складываю элементы в каждом из вторых списков:
mean_list = []
for i in list1:
each_item = 0
for ca in i[1]:
each_item = ca
mean_list.append(each_item)
print(mean_list)
Конечным результатом должно быть mean_list = [21, 24, 27]
использование приведенного выше примера.
Комментарии:
1. В чем смысл вложенных списков [1, 2, 3]?
2. Код возвращает две вещи, затем я помещаю их оба в новый список; код не работает, если я удаляю первые списки
Ответ №1:
Вы можете использовать следующее понимание списка. Первый zip заключается в выборе вторых списков внутри каждого подсписка, а второй — в чередовании элементов из них, чтобы просто взять sum
и mean
:
from statistics import mean
sums, means = zip(*[(sum(i), mean(i)) for i in zip(*list(zip(*l))[1])])
print(sums)
# (21, 24, 27)
print(means)
# (7, 8, 9)
Комментарии:
1. На самом деле я забыл упомянуть, что мне нужно было бы найти среднее значение для каждой вещи (так что в данном случае это было бы [7, 8, 9]
2. среднее значение для каждой вещи? откуда берутся
[7, 8, 9]
? @JonathanDyke3. В этом случае добавляются три элемента, поэтому [7, 8, 9] будет [21/3, 24/3, 28/3], и я раньше не использовал zip, поэтому я не уверен, откуда вы извлекаете количество суммируемых элементов (просто выполнение / 3 не сработало бы, потому что фактическое количество списков изменяется)
Ответ №2:
Я не знаю, какова точная цель, но жестко мы можем это сделать….
l = [[[1, 2, 3], [4, 5, 6]], [[1, 2, 3], [7, 8, 9]], [[1, 2, 3], [10, 11, 12]]]
mean_list = []
for i in range(len(l[0][0])):
mysum = 0
for j in l:
mysum =j[1][i]
mean_list.append(mysum)
print(mean_list)
Выводит
[21, 24, 27]
Ответ №3:
Вы можете легко сделать это с помощью numpy sum.
import numpy as np
list1 = [[[1, 2, 3], [4, 5, 6]], [[1, 2, 3], [7, 8, 9]], [[1, 2, 3], [10, 11, 12]]]
result = np.array(list1).sum(axis = 0)[1]
print(result)
#array([21, 24, 27])
РЕДАКТИРОВАТЬ: Для Mean, как, по-видимому, хотел OP, просто измените операцию sum на mean .
result_mean = np.array(list1).mean(axis = 0)[1]
#array([7., 8., 9.])
Ответ №4:
Это похоже на тензор. Вы можете использовать numpy
для добавления матрицы, это будет намного быстрее, чем любая ручная работа.
import numpy as np
mat = np.array([[[1, 2, 3], [4, 5, 6]], [[1, 2, 3], [7, 8, 9]], [[1, 2, 3], [10, 11, 12]]])
print(mat.mean(axis=0)[1]) # [7, 8, 9]
Комментарии:
1. или
mat.sum(axis=0)[1]
Ответ №5:
Некоторое понимание, суммирование и zip-магия:
>>> i = [[[1, 2, 3], [4, 5, 6]], [[1, 2, 3], [7, 8, 9]], [[1, 2, 3], [10, 11, 12]]]
>>> q = [x[1] for x in i]
>>> [sum(i) for i in zip(*q)]
[21, 24, 27]
Чтобы получить среднее значение, разделите на длину:
>>> [sum(i)/len(i) for i in zip(*q)]
[7.0, 8.0, 9.0]
Ответ №6:
Вы можете использовать double zip
для понимания списка:
l = [[[1, 2, 3], [4, 5, 6]], [[1, 2, 3], [7, 8, 9]], [[1, 2, 3], [10, 11, 12]]]
[sum(j) for num, i in enumerate(zip(*l))
for j in zip(*i) if num % 2]
# [21, 24, 27]
Если вам нужно среднее значение, используйте statistics.mean()
вместо sum
.