2017-01-01 68 views
9

在程序我写,我需要乘以列表中的每个元素与所有其他元素,像这样:乘在一起列表中的所有元素(另一个列表索引超出范围的问题)

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 
+2

看看itertools.product –

+3

我想'itertools.combinations'是更像他的例子所显示的。 – BrenBarn

回答

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] 
24
from itertools import combinations 

xs = [1, 2, 3] 
products = [x1 * x2 for x1, x2 in combinations(xs, 2)] 
1
[v1 * list1[j] for i, v1 in enumerate(list1) for j in xrange(i)] 

itertools shmitertools ..

虽然这是第二快的答案她e,它比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 
+2

请不要这样做。 Python令人难以置信的迭代工具是使它变得如此伟大的原因之一。迭代指数是明显的倒退。它会导致更多的混乱和更少的可读性,而且它几乎没有必要。 – jpmc26

+0

已确认轻微的文体变更,但第二个xrange难以删除 – user3684792

+0

尝试'对于列表1中的列表1中的列表1中的列表1。 – jpmc26

1

正如FMc所说,itertools是最简单的解决方案。但是,查看您提供的代码有什么问题可能会有所帮助,而不是仅编写全新的代码。有三个问题:
1.您为列表(列表和因子)使用两个不同的名称。
2.当i为0时,包含形状因子[j] * factor [j]的产品。
3.当i + n超出范围时,您所做的操作不起作用 - 它仍可能导致一些超出范围。
3的一个可能的解决方案是在这一点上简单地跳出内部循环:如果你超出范围,你不想为这个我做任何事情,或者为了更大的我做同样的j。因此,这将给予

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) 

然而,循环更好的方法,通过列表这样是使用枚举:

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)