2015-12-19 1 views
1

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

list_of_lists=[[1,2,3], [4,5,2], [3,2,4]] 

Я хочу создать функцию, чтобы применить различный вес для каждого из этих внутренних списков.

Так что, когда я пишу weighted_lists(list_of_lists,10,2,5.5):
- Первый внутренний список должен быть умножен на 10
- Второй внутренний список должен быть умножен на 2
- Третий внутренний список должен быть умножен на 5,5

Таким образом, в результате я должен иметь следующее:

weighted_lists=[[10,20,30], [8,10,4], [16.5,11,22]] 

Обратите внимание, что эта функция должна поддерживать различное число внутренних списков (в некоторых случаях, возможно, 3, в других случаях ш e может иметь 400).

+0

Вы спрашиваете нам решить домашнее задание вопрос? –

+0

№ Просто не знаю, как заставить мой код взаимодействовать таким образом. – abutremutante

ответ

1

Вы можете посмотреть в numpy что-то вроде этого:

In [14]: import numpy as np 

In [15]: list_of_lists=[[1,2,3],[4,5,2],[3,2,4]] 

In [16]: weights = [10, 2, 5.5] 

In [17]: (np.array(list_of_lists) * np.array(weights)[:, None]).tolist() 
Out[17]: [[10.0, 20.0, 30.0], [8.0, 10.0, 4.0], [16.5, 11.0, 22.0]] 
+0

Я бы просто добавил tolist() в массив np – abutremutante

+0

Имеет смысл, я обновил его. Благодарю. – Akavall

2

Здесь вы идете, lol - это список списков.

def weighted_lists(lol, *weights): 
    if len(lol) != len(weights): 
     raise IndexError 

    return [[weight*x for x in inner] for inner, weight in zip(lol, weights)] 

Демо:

list_of_lists=[[1,2,3], [4,5,2], [3,2,4]] 
print(weighted_lists(list_of_lists, 10, 2, 5.5)) # [[10, 20, 30], [8, 10, 4], [16.5, 11.0, 22.0]] 
0

Если вы предпочитаете функционален, вы могли бы сделать это с помощью itertools и operator.mul:

list_of_lists = [[1, 2, 3], [4, 5, 2], [3, 2, 4]] 
from itertools import izip, starmap, repeat 
from operator import mul 

def weighted_lists(l, *args): 
    return (list(starmap(mul, izip(*(s, repeat(i))))) for s, i in izip(l, args)) 


print(list(weighted_lists(list_of_lists, 10, 2, 5.5))) 
[[10, 20, 30], [8, 10, 4], [16.5, 11.0, 22.0]] 
0

Используя enumerate и lambda, вы можете добиться того же результата.

list_of_lists = [[1,2,3], [4,5,2], [3,2,4]] 

def weighted_lists(a_list_of_lists, *some_weights): 
    weighted_list_of_list = [] 
    for i, a_list in enumerate(a_list_of_lists): 
     new_list = map(lambda value: value * some_weights[i], a_list) 
     weighted_list_of_list.append(new_list) 

    return weighted_list_of_list 

И один лайнер:

f = lambda x, *y: [map(lambda v: v * y[i], l) for i, l in enumerate(x)] 

Результат:

>>> f(list_of_lists, 10, 2, 5.5) 
[[10, 20, 30], [8, 10, 4], [16.5, 11.0, 22.0]] 
>>> weighted_lists(list_of_lists, 10, 2, 5.5) 
[[10, 20, 30], [8, 10, 4], [16.5, 11.0, 22.0]] 
Смежные вопросы