Вставка поэлементного среднего вложенного списка в тот же список

#python #list #nested-lists

#python #Список #вложенные списки

Вопрос:

Предположим, что существует список вложенных списков с плавающими значениями

 L = [[a,b,c],[e,f,g],[h,i,j]]
  

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

 L1 = [[a,b,c],[(a e)/2,(b f)/2,(c g)/2],[e,f,g],[(e h)/2,(f i)/2,(g j)/2],[h,i,j]]
  

Я знаю функцию для получения поэлементного среднего значения двух списков:

 from operator import add
new_list = list(map(add,list1,list2))
J = [j/2 for j in new_list]
  

Однако вставка этого списка средних значений обратно в тот же список при сохранении правильной итерации индекса по старому списку оказалась сложной задачей.

Комментарии:

1. Просто создайте новый список и при необходимости измените его обратно в исходный список.

Ответ №1:

Есть два случая:

  1. Вам все равно, является ли результирующий список тем же списком:
 new_list = []
for i in range(len(L)-1):
    new_list.append(L[i])
    new_list.append(list(map(lambda x: sum(x)/len(x), zip(L[i],L[i 1]))))
new_list.append(L[-1])
  
  1. Вы хотите, чтобы изменения были выполнены на месте:
 i=0
while i < len(L)-1:
    new_elem = list(map(lambda x: sum(x)/len(x), zip(L[i],L[i 1])))
    L.insert(i 1, new_elem)
    i  = 2
  

РЕДАКТИРОВАТЬ: Если вы используете python 3.4 или выше, вместо lambda x: sum(x)/len(x) вы можете использовать mean(x) (из пакета statistics ).

Комментарии:

1. спасибо, для номера 2 есть небольшая опечатка: i < len(L) — 1

2. избегайте использования lambda и просто используйте встроенный mean из stdlib в statistics библиотеке