Создать массив, объединив соседние пары элементов

У меня есть следующий массив из четырех элементов:

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
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
60
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы можете использовать 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]

Другие вопросы по теме