Как переставить значения в списке на основе значений в другом списке? - PullRequest
3 голосов
/ 16 марта 2020

У меня есть следующий список:

PastValues = [76978.359, 71079.933, 75580.227]

Я сделал:

PastValues2 = PastValues + [-value for value in PastValues]

, чтобы создать отрицательные значения значений в PastValues и объединить их с значения в PastValues, и это дало мне следующий список PastValues2:

[76978.359, 71079.933, 75580.227, -76978.359, -71079.933, -75580.227]

Я хотел бы знать, есть ли способ переставить значения в PastValues2, чтобы они были одинаковыми заказ как в PastValues.

Желаемый вывод:

PastValues2 = [-76978.359, 76978.359, -71079.933, 71079.933, -75580.227, 75580.227]

Поскольку в списке PastValues 76978.359 был первый элемент, я хочу первые 2 элемента в PastValues2 быть отрицательными и положительными значениями, соответственно. Аналогично для других элементов в списке PastValues. Отрицательные значения должны предшествовать положительным значениям

Ответы [ 5 ]

5 голосов
/ 16 марта 2020

Вы можете использовать понимание списка:

[e for i in PastValues for e in [-i, i]]

# [-76978.359, 76978.359, -71079.933, 71079.933, -75580.227, 75580.227]
1 голос
/ 16 марта 2020

Вы можете использовать operator.neg и itertools.chain. это будет более эффективно, чем понимание, особенно вложенное!

from itertools import chain
from operator import neg

PastValues = [76978.359, 71079.933, 75580.227]

PastValues2 = list(chain.from_iterable(zip(map(neg, PastValues), PastValues)))
1 голос
/ 16 марта 2020

Вы можете сделать это через двойной цикл:

PastValues = [76978.359, 71079.933, 75580.227]

PastValues2 = [value*sign for value in PastValues for sign in [-1,1]]

# [-76978.359, 76978.359, -71079.933, 71079.933, -75580.227, 75580.227]
1 голос
/ 16 марта 2020

Вот подход, основанный на NumPy, использующий умножение широковещания:

(np.array(PastValues)*np.array([-1,1])[:,None]).ravel('F')

array([-76978.359,  76978.359, -71079.933,  71079.933, -75580.227,
        75580.227])
1 голос
/ 16 марта 2020

Вы можете перебирать список и формировать отрицательные и положительные значения в каждой итерации. Окончательно сгладьте полученный результат, чтобы он соответствовал желаемому результату:

from itertools import chain

PastValues = [76978.359, 71079.933, 75580.227]

result = list(chain.from_iterable(([-x, x] for x in PastValues)))
# [-76978.359, 76978.359, -71079.933, 71079.933, -75580.227, 75580.227]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...