2014-11-11 5 views
1

Я хочу умножить список списков, таких как ([2,3,6], [3,4,9], [4,8,13]) другим списком, который также будет иметь такое же количество списков, что и первый набор списков, т. е. первый список списков может иметь 3 списка, каждый со списком из 5 номеров, но во втором списке будет 3 номера, каждый из которых будет умножать элементы строки первого списка. напримерУмножить список списков по списку

([2,3,6],[3,4,9],[4,8,13]) with [2,3,4] 

приведет

([4,6,12],[9,12,27],[16,32,52]) 

до сих пор у меня есть

sol = [inv[i]*bb[i] for i in range(len(inv[i]))] 
     return sol 

где и [я] мой список списков и бб мой список.

я хочу это так, что это может быть сделано для любой длины списка в ббе и и [я] до тех пор, как они оба такие же длины

спасибо, ребята

UPDATE:

я добавил в растворе фунта и возился немного

теперь печатает

[20.0, -9.0, -3.0] 
[40.0, -18.0, -6.0] 
[40.0, -18.0, -6.0] 
[40.0, -18.0, -6.0] 
[3.0, -2.0, -0.0] 
[40.0, -18.0, -6.0] 
[40.0, -18.0, -6.0] 
[40.0, -18.0, -6.0] 
[-8.0, 4.0, 1.0] 
[40.0, -18.0, -6.0] 
[40.0, -18.0, -6.0] 
[40.0, -18.0, -6.0] 

для этого кода:

print (inv[i]) 

     sol = [] 
     for i, item in enumerate(inv): 
      sol.append(map(lambda x: x*bb[i], item)) 

      print sol[i] 

как я избавиться от ерунды вещи и сохранить последние 3 строки видны только?

+0

Пробовали ли вы unindenting 'печати золя [я]', и заменить его: 'печати sol' (опустить '[i]')? – Dair

ответ

0
import itertools 

L = [[2,3,6],[3,4,9],[4,8,13]] 
M = [2,3,4] 
[[i*j for i,j in zip(subl, subm)] for subl, subm in zip(L, itertools.cycle([M]))] 

Ouptut:

Out[101]: [[4, 9, 24], [6, 12, 36], [8, 24, 52]] 

Без itertools:

answer = [] 
for subl in L: 
    temp = [] 
    for i in range(len(subl)): 
     temp.append(subl[i] * M[i]) 
    answer.append(temp) 

Выход:

In [103]: answer 
Out[103]: [[4, 9, 24], [6, 12, 36], [8, 24, 52]] 
+0

извините, я хочу попробовать сделать это без импорта, если это возможно ... –

+0

и без почтового индекса, но спасибо в любом случае :) –

0
big = [[2,3,6],[3,4,9],[4,8,13]] 
small = [2,3,4] 

res = [] 

for i, item in enumerate(big): 
    res.append(map(lambda x: x*small[i], item)) 

print res 

Выход:

[[4, 6, 12], [9, 12, 27], [16, 32, 52]] 
+0

sol.append (карта (лямбда x: x * bb [i], item)) TypeError: аргумент 2 для map() должен поддерживать итерацию - это то, что я получаю, - и вход для списка не определен. это может быть любое случайное значение inout в shell. Я сделал это def def –

+0

Какой у вас новый код? Мой код работает на моей машине. – Dair

+0

для г в xrange (LEN (INV)): печати (INV [I]) обратными = INV [I] золь = [] для г, элемент в Перечислим (обратный): золь .append (карта (лямбда-х: * бб [я], пункт)) печати золь я изменил большие и маленькие, чтобы соответствовать моим переменным .. верхняя часть после того, как я закончил некоторые расчеты –

0

Использование NumPy библиотека:

import numpy as np 
list1 = np.array([[2,3,6],[3,4,9],[4,8,13]]) 
list2 = np.array([2,3,4]) 
result = list1 * list2.transpose() 
result_list = result.tolist() 

Или без NumPy:

list1 = [[2,3,6],[3,4,9],[4,8,13]] 
list2 = [2,3,4] 
result_list = list1[:] 
for i in range(len(list1)): 
    result_list[i] = [x * list2[i] for x in result_list[i]] 
+0

Ницца, но «извините, я хочу попытаться сделать это без импорта, если это возможно ... »- OP – Dair

+0

Зачем искать сложные решения? Numpy хорошо и легко, плюс библиотека Numpy реализована на C и очень быстро, в то время как петли Python очень медленные. Просто сравните производительность по более крупным спискам;) – ojy

+0

Lol. Как только вы используете numpy, вы никогда не вернетесь, я думаю ...;) – Dair