如何在列表列表中查找每一行的产品?

时间:2015-09-27 06:17:57

标签: python

说我有一份清单清单:

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)

我试图弄清楚如何用循环来做这件事,但我似乎无法弄明白。

5 个答案:

答案 0 :(得分:2)

您可以使用numpyitertools.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])]
>>> 

答案 1 :(得分: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)]

答案 2 :(得分:0)

你可以试试这样的东西(Python 2.7,如果你使用的是Python,请用xrange替换range

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]))

答案 3 :(得分:0)

没有导入任何模块的显式解决方案是

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

但当然它有三个"循环",一个用于两行和两个嵌套的产品,用于获得所有可能的不同行的配对。

他们列出了理解循环,但仍然循环。

PS:永远不要在Python代码中调用列表list。这将隐藏系统类型的名称和(非常)惊喜程序员。

答案 4 :(得分: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