2017-01-01 35 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)