2015-09-27 2 views
3

Скажем, у меня есть список списков:Как найти продукт каждой строки в списке списков?

list = [[2, 4, 3, 8], 
     [5, 6, 4, 3], 
     [1, 9, 5, 7], 
     [8, 3, 1, 2]] 

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

Таким образом, я получаю произведение строк 1 и 2 (2 * 5, 4 * 6, 3 * 4, 8 * 3), затем произведение строк 1 и 3 (2 * 1, 4 * 9, 3 * 5, 8 * 7), затем произведение строк 1 и строки 4 (2 * 8, 4 * 3, 3 * 1, 8 * 2).

После завершения строки 1 перейдите к строке 2 и получите произведение ряда 2 и ряда 3 (5 * 1, 6 * 9, 4 * 5, 3 * 7), затем произведение строк 2 и 4 (5 * 8, 6 * 3, 4 * 1, 3 * 2).

Наконец, мы грести 3 и ряд 4 (1 * 8, 9 * 3, 5 * 1, 7 * 2)

Я пытаюсь выяснить, как сделать это с петель, но я похоже, не может понять это.

ответ

1
>>> zip(*(tuple(x * y for x, y in itertools.combinations(row, 2)) for row in zip(*LL))) 
[(10, 24, 12, 24), (2, 36, 15, 56), (16, 12, 3, 16), (5, 54, 20, 21), (40, 18, 4, 6), (8, 27, 5, 14)] 
+0

Приятно видеть такой поворот для вопроса gimme codez. – msw

+1

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

0

Вы могли бы попробовать что-то вроде этого (Python 2.7, замените xrange на range, если вы используете Python 3)

list = [[2, 4, 3, 8], 
     [5, 6, 4, 3], 
     [1, 9, 5, 7], 
     [8, 3, 1, 2]] 

def multiply_rows(a, b): 
    # Assuming all rows are the same length. 
    return [a[i] * b[i] for i in xrange(0, len(a))] 

for i in xrange(0, len(list)): # Iterate through all the rows 
    for j in xrange(i+1, len(list)): # Making sure not to multiply the same rows twice 
     print(multiply_rows(list[i], list[j])) 
2

Вы можете использовать numpy и itertools.combinations:

import numpy as np 
from itertools import combinations 

>>> [np.array(i)*j for i,j in combinations(li,2)] 
[array([10, 24, 12, 24]), array([ 2, 36, 15, 56]), array([16, 12, 3, 16]), array([ 5, 54, 20, 21]), array([40, 18, 4, 6]), array([ 8, 27, 5, 14])] 
>>> 
0

явное решение без импорта какого-либо модуля -

[[x*y for x, y in zip(rowx, rowy)] 
for ix, rowx in enumerate(L) 
for rowy in L[ix+1:]] 

но, конечно, он имеет три «петли», один для произведения двух строк и двух вложенных для получения всех возможных парных строк.

Они представляют собой списки, в которых используются контуры, но все же петли.

PS: никогда не вызывайте список list в коде Python. Это скроет название системного типа и (плохо) программистов-сюрпризов.

0

Попробуйте следующее: Даже другие решения отличные, но если вы новичок, это будет большой помощью.

from itertools import izip #faster than zip 
from operator import mul 
my_list=[[2, 4, 3, 8], 
     [5, 6, 4, 3], 
     [1, 9, 5, 7], 
     [8, 3, 1, 2]] 
final_list=[] 
for n,i in izip(*my_list): 
    final_list.append(reduce(mul,i,1)) 

print final_list 
Смежные вопросы