Обмен значениями двух списков на основе заданного индекса - PullRequest
0 голосов
/ 02 июля 2018

У меня есть список, состоящий из двух пустых массивов, первый из которых содержит индекс значения, а второй содержит само значение принадлежности. Это выглядит примерно так:

x_glob = [[0, 2], [85, 30]]

Функция получает следующий вход:

x = [-10, 0, 77, 54]

Моя цель - поменять местами значения x на значения из x_glob на основе заданного индексного массива из x_glob. Этот пример должен привести к чему-то вроде этого:

x_new = [85, 0, 30, 54]

У меня есть решение с использованием цикла. Но я уверен, что в python есть способ решить эту проблему более эффективно и элегантно.

Спасибо!

Ответы [ 3 ]

0 голосов
/ 02 июля 2018

Для решения, отличного от numpy, вы можете создать dict, отображающее индексы от x_glob до соответствующих значений, а затем использовать понимание списка с помощью метода get этого диктанта:

>>> x_glob = [[0, 2], [85, 30]]
>>> x = [-10, 0, 77, 54]
>>> d = dict(zip(*x_glob))
>>> [d.get(i, n) for i, n in enumerate(x)]
[85, 0, 30, 54]

Или используя map с несколькими списками параметров (или без zip, используя itertools.starmap):

>>> list(map(d.get, *zip(*enumerate(x))))
[85, 0, 30, 54]
0 голосов
/ 02 июля 2018

Мое решение также использует цикл for, но он довольно короткий и элегантный (я думаю), работает на месте и эффективен, так как не требует итерации по полному массиву x, только через список глобусов:

for k,v in zip(*x_glob):
    x[k] = v
0 голосов
/ 02 июля 2018

NumPy массивы могут быть проиндексированы с другими массивами , что делает эту замену тривиальной.

Все, что вам нужно сделать, это проиндексировать ваш второй массив с помощью x_glob[0], а затем присвоить x_glob[1]

x[x_glob[0]] = x_glob[1]

Чтобы увидеть как это работает, просто посмотрите на результат индексации:

>>> x[x_glob[0]]
array([-10,  77])

Результатом является массив, содержащий два значения, которые нам нужно заменить, которые мы затем заменим другим массивом numpy, x_glob[1], для достижения желаемого результата.


>>> x_glob = np.array([[0, 2], [85, 30]])
>>> x = np.array([-10, 0, 77, 54])
>>> x[x_glob[0]] = x_glob[1]
>>> x
array([85,  0, 30, 54])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...