2016-06-28 3 views
1

У меня есть два списка:питон умножить два списка поэлементно - один из них вложен

C = [3, 2, 1] 
D = [[0, 1, 2, 3], [0, 1, 2], [0, 1]] 

Я хотел бы, чтобы достичь этого результата:

E = [[0, 3, 6, 9], [0, 2, 4], [0, 1]] 

используя только список comprehensions.Is это возможно ? Я застрял на:

E = zip(C, D) 
[i * E[0][0] for i in E[0][1]] which gives: 

[0, 3, 6, 9] 

, но я не могу изменить его применить к другим элементам второго списка

ответ

2

Вы почти там: это вложенный список понимание. Резвый другой список, [бла [J] для J в]

C = [3, 2, 1] 
D = [[0, 1, 2, 3], [0, 1, 2], [0, 1]] 

E = zip(C, D) 
print [[i * E[j][0] for i in E[j][1]] for j in range(len(E))] 

Выход:

[[0, 3, 6, 9], [0, 2, 4], [0, 1]] 
4

Да, можно:

>>> [[c * d_i for d_i in d] for c, d in zip(C, D)] 
[[0, 3, 6, 9], [0, 2, 4], [0, 1]] 

Вам просто нужно две петли здесь, то первый для итерации более zip(C, D), а второй для перебора по каждому списку D

0

Это wou л.д. быть прямо вперед, если вы используете numpy массив:

import numpy as np 
np.array(C) * np.array(map(np.array, D)) 

# array([array([0, 3, 6, 9]), array([0, 2, 4]), array([0, 1])], dtype=object) 
0

Я хотел бы также решить эту проблему с itertools.startmap:

>>> from itertools import starmap 
>>> 
>>> def multiply(x, lst): 
     return [x*i for i in lst] 

>>> for item in it.starmap(f, zip(C,D)): 
     print(item) 


[0, 3, 6, 9] 
[0, 2, 4] 
[0, 1] 

ИЛИ:

>>> l = [] 
>>> for item in it.starmap(lambda x,y: [x*i for i in y], zip(C,D)): 
     l.append(item) 
>>> l 
[[0, 3, 6, 9], [0, 2, 4], [0, 1]] 
Смежные вопросы