Предполагая, что все подсписки имеют одинаковую длину, вы можете использовать zip
сделать это легко:
ally = [...]
averages = [sum(suby)/len(suby) for suby in zip(*ally)]
zip(*ally)
эффективно преобразует [[a1, a2, ...], [b1, b2, ...]]
в tuple
с (a1, b1)
, (a2, b2)
и т. Д., Поэтому Python выполняет работу по сопоставлению значений из каждого из подписок для вас.
Если вы хотите обрабатывать случай, когда длины подписок не совпадают (например, [[a1, a2], [b1, b2, b3]]
), это было бы более сложным; Вы должны были бы использовать itertools.zip_longest
(izip_longest
на Python 2) и отфильтровать записи барахла, чтобы избежать включения их в среднем:
from itertools import zip_longest
# zip_longest matches up values until last value exhausted
# with shorter sequences substituting in None
# We then use the generator expression to remove the Nones
stripped = ([y for y in suby if y is not None] for suby in zip_longest(*ally))
# Then average as normal
averages = [sum(suby)/len(suby) for suby in stripped]
Если вы хотите, чтобы лечить слишком короткие суб- list
с, как 0
(так будете уменьшить средний), это проще:
averages = [sum(suby)/len(suby) for suby in zip_longest(*ally, fillvalue=0)]
где fillvalue
может быть изменено на другое значение по умолчанию, как хотелось бы.
Примечание: Если это Python 2 кода, sum(suby)/len(suby)
будет использовать усечение деления, если все значения int
/long
; если вы хотите истинное деление, добавьте from __future__ import division
в начало файла (или запустите его в своем интерпретаторе), чтобы получить истинное деление Py3 по умолчанию (используйте //
для разделения полов) или оберните len(suby)
в конструкторе float()
(или умножьте его по 1.0
, что бы вы ни хотели), чтобы вы не уронили остаток на полу.
Вы уверены, что все они имеют одинаковую длину? –
Посмотрите там http://stackoverflow.com/questions/9039961/finding-the-average-of-a-list – mrvol
Вы должны использовать цикл для обработки элементов списков. – dsh