Понимание списка с двумя выходами - PullRequest
0 голосов
/ 12 февраля 2020

Я пытаюсь оптимизировать этот код:

num = 10
for j in xrange(0,num):
  u[j],v[j] = rk4(du,dv,t,dt,u[j],v[j])

, где u и v - входные массивы, а rk4 () возвращает два значения для двух входных значений. Используя понимание списка, я бы сделал что-то вроде этого:

u,v=[rk4(du,dv,t,dt,u[j],v[j])) for j in range(0,num)]

Работа со списком работает. Но вывод в другом формате. Можно ли оптимизировать этот вид операции, используя понимание списка?

Редактировать: желаемый результат будет двумя массивами / списками вида

u,v = [u1,u2,u3,....],[v1,v2,v3,...]

Что я получаю из следующего Форма:

[(u1,v1),(u2,v2),(u3,v3),...]

1 Ответ

3 голосов
/ 12 февраля 2020

Похоже, что вы хотите преобразовать последовательность пар в две последовательности. В Python есть стандартная идиома, чтобы сделать это с помощью функции zip и распаковки аргументов:

>>> seq_of_pairs = [('a', 1), ('b', 2), ('c', 3), ('d', 4)]
>>> u, v = zip(*seq_of_pairs)
>>> u
('a', 'b', 'c', 'd')
>>> v
(1, 2, 3, 4)

Таким образом, вы можете использовать понимание списка (или выражение генератора) для получения последовательности пар, используя zip, а затем используйте этот трюк для извлечения двух последовательностей:

result = [ rk4(..., ui, vi) for ui, vi in zip(u, v) ]
u, v = zip(*result)

Вы можете сделать u, v = map(list, zip(*result)), если вам нужно, чтобы они были списками, а не кортежами.

...