У меня есть следующий массив из четырех элементов:
arr = [{"location": 10, "value": 50}, {"location": 21, "value": 70}, {"location": 33, "value": 20}, {"location": 48, "value": 0}]
Я хотел бы создать новый массив из трех элементов, объединяющих соседние элементы: [{индекс 0, 1}, {индекс 1, 2}, {индекс 2, 3}]
Функция для запуска каждой пары проста:
def combine(current, next):
return (next["location"] - current["location"]) * current["value"]
Очевидно, это можно сделать с помощью цикла, но есть ли более питонический способ добиться этого? Я хотел бы создать следующий вывод:
[550, 840, 300] // (21 - 10) * 50, (33 - 21) * 70, (48 - 33) * 20






Вы можете использовать zip(arr, arr[1:]):
def get_combine_neighbors(A):
_comb = lambda x, y: (y["location"] - x["location"]) * x["value"]
return [_comb(x, y) for x, y in zip(A, A[1:])]
A = [{"location": 10, "value": 50}, {"location": 21, "value": 70},
{"location": 33, "value": 20}, {"location": 48, "value": 0}]
print(get_combine_neighbors(A))
[550, 840, 300]
Я бы сначала извлек из вашего списка правильный массив numpy, после чего вычисление результата происходит немедленно.
import numpy as np
data = np.array([list(d.values()) for d in arr]).T
res = (arr[0, 1:] - arr[0, :-1]) * arr[1, :-1]
print(res)
Выход:
array([550, 840, 300])
r = [(arr[i+1]['location']-arr[i]['location'])*arr[i]['value']\
for i in range(len(arr)) if i != len(arr) - 1 ]
print(r) # Output : [550, 840, 300]