Python 仓位组合列表
Python list of combinations of positions
我正在尝试为任意数量的相同对象生成所有可能的一维位置列表。我希望它被格式化,所以每个坐标都是与前一个对象的距离,所以对于 3 个对象 (0,5,2) 将意味着一个对象在位置 0,另一个在位置 5,另一个在位置 7。
所以主要约束是坐标之和<=D。嵌套 for 循环对此很有效。例如,具有最大坐标 D:
的 3 个对象
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 循环,我找不到好的方法。
我认为您可以将 itertools.combinations
与差值相结合,后者将为您提供位置,而差值则应为您提供 "distance from the previous object" 行为。例如,使用
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]]
对于你的相对距离版本。
我正在尝试为任意数量的相同对象生成所有可能的一维位置列表。我希望它被格式化,所以每个坐标都是与前一个对象的距离,所以对于 3 个对象 (0,5,2) 将意味着一个对象在位置 0,另一个在位置 5,另一个在位置 7。
所以主要约束是坐标之和<=D。嵌套 for 循环对此很有效。例如,具有最大坐标 D:
的 3 个对象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 循环,我找不到好的方法。
我认为您可以将 itertools.combinations
与差值相结合,后者将为您提供位置,而差值则应为您提供 "distance from the previous object" 行为。例如,使用
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]]
对于你的相对距离版本。