Python职位组合列表

时间:2015-06-30 22:01:07

标签: python combinations

我正在尝试为任意数量的相同对象生成所有可能的1维位置的列表。我希望它格式化,因此每个坐标是与前一个对象的距离,因此对于3个对象(0,5,2)将意味着一个对象位于位置0,另一个位于位置5而另一个位于位置7。

因此主要的限制是坐标之和<= D。嵌套for循环适用于此。例如,3个具有最大坐标D的对象:

def positions(D):
    output=[]
    for i in range(D+1):
        for j in range(D+1-i):
            for k in range(D+1-i-j):
                 output.append((i,j,k))
     return(output)

将此扩展到任意数量的对象的最佳方法是什么?没有明确写出特定数量的for循环,我找不到一个好方法。

1 个答案:

答案 0 :(得分:3)

我认为你可以结合itertools.combinations,它会给你带来位置,带来差异,这应该会给你“与前一个对象的距离”行为。例如,使用

def diff(loc):
    return [y-x for x,y in zip((0,) + loc, loc)]

我们有

In [114]: list(itertools.combinations(range(4), 3))
Out[114]: [(0, 1, 2), (0, 1, 3), (0, 2, 3), (1, 2, 3)]

表示可能的位置,然后是

In [115]: [diff(x) for x in itertools.combinations(range(4), 3)]
Out[115]: [[0, 1, 1], [0, 1, 2], [0, 2, 1], [1, 1, 1]]

您的相对距离版本。