将列表中的所有元素相乘(另一个列表索引超出范围问题)

时间:2017-01-01 19:50:47

标签: python python-2.7

在我正在编写的程序中,我需要将列表中的每个元素与所有其他元素相乘,如下所示:

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

4 个答案:

答案 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)