2015-12-21 15 views
0

Я как-то застрял и был бы признателен за некоторые полезные указатели.Средние элементы в списке переменных списков

Я не знаю заранее длину списка [X]; то есть количество подписок [y1, y2, y3, ..., yn].

Как я могу работать с каждым элементом из каждого подписок в качестве функции положения?

То есть,

Z1 = ср (у1 [1] + у2 [1] +, ...., + у [1] п)

Z2 = ср (у1 [2] + y2 [2] +, ...., + y [2] n)

Z3 = avg (y1 [3] + y2 [3] +, ...., + y [3] n)

.

.

.

Zm = ср (у1 [м] + у2 [м] + ...., + у [м] п)

Любой входной сигнал значительно оценен,

Маркус

+0

Вы уверены, что все они имеют одинаковую длину? –

+2

Посмотрите там http://stackoverflow.com/questions/9039961/finding-the-average-of-a-list – mrvol

+0

Вы должны использовать цикл для обработки элементов списков. – dsh

ответ

0

Предполагая, что все подсписки имеют одинаковую длину, вы можете использовать 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, что бы вы ни хотели), чтобы вы не уронили остаток на полу.

Смежные вопросы