#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:
Есть два случая:
- Вам все равно, является ли результирующий список тем же списком:
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])
- Вы хотите, чтобы изменения были выполнены на месте:
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
библиотеке