Python: изменение списка с помощью вложенных циклов в понимании списка - PullRequest
0 голосов
/ 03 октября 2018

У меня есть часть кода, которая выполняет нечто аналогичное следующему:

import numpy as np
N = 10
test = [1] * N
np.random.seed(123)
norm = np.random.rand(N)
my_dic = {(k, kk):np.random.rand(1) for k,_ in enumerate(test) for kk in range(5)}
for i, _ in enumerate(test):
    test[i] *= norm[i]
    for j in range(5):
        test[i] *= my_dic[(i, j)]

Поскольку оба цикла модифицируют список, есть ли способ перевести это для понимания списка?Я пробовал варианты следующих безуспешно:

import numpy as np
N = 10
test = [1] * N
np.random.seed(123)
norm = np.random.rand(N)
my_dic = {(k, kk):np.random.rand(1) for k,_ in enumerate(test) for kk in range(5)}

test = [val for val in norm]
test = [test[i] * my_dic[(i, j)] for i, _ in enumerate(test) for j in range(5)]       

1 Ответ

0 голосов
/ 03 октября 2018

Если вы настаиваете на этом с одиночным списком, я думаю, вы можете сделать что-то вроде:

from operator import mul
from functools import reduce  # comment out on Python 2.x

test[:] = [reduce(mul, [v * norm[i]] + [my_dic[(i, j)] for j in range(5)], 1)
           for i, v in enumerate(test)]

Или:

test[:] = [v * norm[i] * reduce(mul, (my_dic[(i, j)] for j in range(5)), 1)
           for i, v in enumerate(test)]

Нореальный вопрос - почему?Вы затрудняете чтение и / или сопровождение, и вы не получаете много в отделе производительности.

...