2015-10-16 67 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