2015-10-16 56 views
-1

我有一個數組甲上的每個陣列元件對執行操作迅速

A = [5,2,8,14,6,13] 

我想獲得,其中每個元素被添加到所有其他元素的陣列,所以第五行將是5 +的每個元素,那麼接下來的四個是2 +的每個元素等 那麼結果將是

B = [7,13,19,11,18, 10,16,8,15, 22,14,21, 20,27, 19] 

什麼是做到這一點,而無需使用for循環的最快方法?

注:我試圖解決的問題涉及大型布爾數組而不是整數,實際操作是一個布爾型'和',而不僅僅是加法。爲簡化解釋,我簡化了這個問題。到目前爲止,我一直在使用循環,但我正在尋找更快的替代方案。

+3

向我們展示你有什麼權利了。 –

+0

我們需要先建立一個緩慢的方式。你有什麼? –

+0

這是什麼讓你覺得你的循環效率低下? – AlG

回答

5

使用`itertools.combinations

from itertools import combinations 
a = [5,2,8,14,6,13] 

print [sum(i) for i in list(combinations(a, 2))] 

不需要list()。由於@PeterWood

print [sum(i) for i in combinations(a, 2)] 

輸出:

[7,第13,19,11,18,10,16,8,15,22,14,21,20,27,19]

Demo

+0

謝謝,這個速度明顯加快 – berkelem

+0

您不需要將組合轉換爲列表'。 –

+0

@MatthewBerkeley不客氣 – sam

1

你可以做到這一點遞歸:

def add_value_to_rest(sequence): 
    if not sequence: 
     return [] 
    else: 
     additional = sequence[0] 
     return ([additional + value for value in sequence] + 
       add_value_to_rest(sequence[1:])) 

隨着發電機,在Python 3:

def add_value_to_rest(sequence): 
    if sequence: 
     additional = sequence[0] 
     for value in sequence: 
      yield additional + value 
     yield from add_value_to_rest(sequence[1:]) 

或者使用Python 2.7:

def add_value_to_rest(sequence): 
    if sequence: 
     additional = sequence[0] 
     for value in sequence: 
      yield additional + value 
     for value in add_value_to_rest(sequence[1:]): 
      yield value 
+0

感謝您的建議。 我嘗試了遞歸方法,雖然它稍微快一點,但增益大約爲2%。 生成器方法看起來很有趣,但我正在運行Python 2.7,它沒有內置的'yield'。 上面的itertools.combinations方法更快了50%。 – berkelem

-2
A = [5,2,8,14,6,13] 
B = [] 
for i, x in enumerate(A): 
    for l in range(len(A) - i - 1): 
     B.append(A[i] + A[i + l + 1]) 
print B 
#[7, 13, 19, 11, 18, 10, 16, 8, 15, 22, 14, 21, 20, 27, 19] 
+1

什麼是'x'在這裏做什麼?如果你不使用它,你可以通過將它分配給'_'來讓讀者明白。因爲我,列舉(A)'。也就是說,這不僅僅是因爲「我在範圍內(len(A)'?並不是你所有的事情只是爲了我,x在枚舉(A)中:對於xx在A [i:]'中:b .append(x + xx)'? –

+0

我試圖儘可能地避免出現循環,因爲開銷太大 – berkelem