说我有一份清单清单:
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)
我试图弄清楚如何用循环来做这件事,但我似乎无法弄明白。
答案 0 :(得分: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])]
>>>
答案 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