在我正在编写的程序中,我需要将列表中的每个元素与所有其他元素相乘,如下所示:
List = [i1, i2, i3]
Result = [i1*i2, i1*i3, i2*i3]
我现在一直在搞乱循环,但我似乎无法让它发挥作用。这是我到目前为止(不起作用,我知道为什么它不起作用,只是征求意见):
def function():
for j in range(len(list)):
n = j+1
for i in range(len(list)):
if n+i > len(list):
n -= 1
x = factor[j] * factor[j+i]
result.append(x)
return
答案 0 :(得分:24)
from itertools import combinations
xs = [1, 2, 3]
products = [x1 * x2 for x1, x2 in combinations(xs, 2)]
答案 1 :(得分:4)
input_list = [1, 2, 3, 4]
result_list = []
for i in range(len(input_list)):
for j in range(i + 1, len(input_list)):
result_list.append(input_list[i] * input_list[j])
print(result_list)
结果:
[2, 3, 4, 6, 8, 12]
答案 2 :(得分:1)
[v1 * list1[j] for i, v1 in enumerate(list1) for j in xrange(i)]
itertools shmitertools ..
虽然这是这里第二快的答案,但它比itertools方法慢一些,并且在风格上略微需要
In [22]: list1 = range(1000)
In [23]: timeit [x1 * x2 for x1, x2 in combinations(list1, 2)]
10 loops, best of 3: 52.8 ms per loop
In [24]: timeit [v1 * list1[j] for i, v1 in enumerate(list1) for j in xrange(i)]
10 loops, best of 3: 55.7 ms per loop
In [25]: def slow_answer(input_list):
result_list = []
for i in range(len(input_list)):
for j in range(i + 1, len(input_list)):
result_list.append(input_list[i] * input_list[j])
return result_list
....:
In [26]: timeit slow_answer(list1)
10 loops, best of 3: 95 ms per loop
答案 3 :(得分:1)
正如FMc所说,itertools是最简单的解决方案。但是,查看您提供的代码的错误可能会有所帮助,而不仅仅是编写全新的代码。有三个问题:
1.您为列表使用两个不同的名称(列表和因子)
2.当i为0时,您包括形状因子[j] * factor [j]的产品
3.当i + n超出范围时你所做的事情不起作用 - 它仍可能导致超出范围的事情。
3的一个可能的解决方案是在这一点上简单地打破内循环:如果你超出范围,你不想为这个i做任何事情,或者对于具有相同j的较大i。这样就可以了。
for j in range(len(factor)):
n = j+1
for i in range(len(factor)):
# we are now going to look up factor[n+i] so need >=
if n+i >= len(factor):
break
# to ensure the second factor is later, use [n+i]>=j+1
x = factor[j] * factor[n+i]
result.append(x)
然而,像这样循环遍历列表的更好方法是使用enumerate:
for j,x in enumerate(factor):
# x is a list element, j is its index
for y in factor[j+1:]:
# loop through remaining elements by slicing
result.append(x*y)