Как выполнять итерацию по нескольким спискам одновременно

#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] ? @JonathanDyke

3. В этом случае добавляются три элемента, поэтому [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 .