结合列表元素

时间:2013-03-18 18:30:48

标签: python

问题: 给定一组数字S_a={n1,n2,n3,...,na}产生以下类型的数字组合:

{Sk,Sp}, where k=1...a, p=k+1,..,a

可以轻松地将此解决方案构建为循环:

N = len(S)
for i in range(0, N):
    for j in range(i+1, N):
                 print("%d,%d" %(i,j))

但我正在寻找一种矢量化解决方案。


另一种变体是考虑对象列表:

class A:
    def function(self, a):
        pass
L = [a1, a2, a3, a4, a5 ]

#where a1,a2,an are of class A.

如何编写此循环的矢量化版本:

N = len(L)-1
for i in range(0, N):
    for j in range(i+1, N):
        L[i].function(L[j])

2 个答案:

答案 0 :(得分:4)

改为使用itertools.combinations()

L = list(itertools.combinations(S, 2))

如果您想将其拆开,文档会详细说明实现。

将它应用到您拥有的对象列表中非常容易:

for i, j in itertools.combinations(L, 2):
    i.function(j)

答案 1 :(得分:1)

如果通过“矢量化”,则表示“内部循环发生在numpy C代码”中:

scipy.misc.comb是生成组合的最简单方法。

对于所有L[i], L[j]i != j,或者您正在考虑的其他任何情况,i < j操作的更一般情况,有几种方法可以做到 - 你可以显式使用broadcast,或者你可以用L创建一个“列向量”和一个“行向量”并只执行操作,或者你可以创建一个L的移位副本的二维数组并应用对此采取行动,或......这实际上取决于你正在做什么。