Python 如何生成二维对象的所有可能性
我必须生成像这样的堆栈中的对象的所有可能性:Python 如何生成二维对象的所有可能性,python,list,permutation,Python,List,Permutation,我必须生成像这样的堆栈中的对象的所有可能性: >>> prod = itertools.product(range(3), range(2), range(5)) >>> [x for x in prod] [(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 0, 3), (0, 0, 4), (0, 1, 0), (0, 1, 1), (0, 1, 2), (0, 1, 3), (0, 1, 4), (1, 0, 0), (1, 0,
>>> prod = itertools.product(range(3), range(2), range(5))
>>> [x for x in prod]
[(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 0, 3), (0, 0, 4), (0, 1, 0), (0, 1, 1), (0, 1, 2), (0, 1, 3), (0, 1, 4), (1, 0, 0), (1, 0, 1), (1, 0, 2), (1, 0, 3), (1, 0, 4), (1, 1, 0), (1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 1, 4), (2, 0, 0), (2, 0, 1), (2, 0, 2), (2, 0, 3), (2, 0, 4), (2, 1, 0), (2, 1, 1), (2, 1, 2), (2, 1, 3), (2, 1, 4)]
- 有n个对象和b个堆栈
- 我关心它们在堆栈中的位置
我对((a,b),…)的表示是否有效?您可以使用
itertools
生成如下组合:
>>> prod = itertools.product(range(3), range(2), range(5))
>>> [x for x in prod]
[(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 0, 3), (0, 0, 4), (0, 1, 0), (0, 1, 1), (0, 1, 2), (0, 1, 3), (0, 1, 4), (1, 0, 0), (1, 0, 1), (1, 0, 2), (1, 0, 3), (1, 0, 4), (1, 1, 0), (1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 1, 4), (2, 0, 0), (2, 0, 1), (2, 0, 2), (2, 0, 3), (2, 0, 4), (2, 1, 0), (2, 1, 1), (2, 1, 2), (2, 1, 3), (2, 1, 4)]
根据数字的不同,这可能会非常低效,但对于较小的值则可以。您可以使用
itertools
生成组合,如下所示:
>>> prod = itertools.product(range(3), range(2), range(5))
>>> [x for x in prod]
[(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 0, 3), (0, 0, 4), (0, 1, 0), (0, 1, 1), (0, 1, 2), (0, 1, 3), (0, 1, 4), (1, 0, 0), (1, 0, 1), (1, 0, 2), (1, 0, 3), (1, 0, 4), (1, 1, 0), (1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 1, 4), (2, 0, 0), (2, 0, 1), (2, 0, 2), (2, 0, 3), (2, 0, 4), (2, 1, 0), (2, 1, 1), (2, 1, 2), (2, 1, 3), (2, 1, 4)]
根据数字,这可能是非常低效的,但是对于小的值,它将是好的。
< P>一个不同的表示可能更简单:将不同的堆栈视为一个大堆栈中的区域,然后元素在堆栈上的分布可以被看作是(a)所有元素的排列,以及(b)将该排列划分为不同的堆栈。例如,对于n=5
和b=3
,排列的一个这样的分区可能是[4 3 | 1 | 2 5]
,即第一个堆栈是[4,3]
,第二个堆栈正好是[1]
,第三个堆栈是[2,5]
import itertools
def partitions(lst, minim, num_part):
if not lst and num_part == 0:
yield []
elif lst and num_part > 0:
for i in range(minim, len(lst) + 1):
for p in partitions(lst[i:], minim, num_part-1):
yield [lst[:i]] + p
def distribute(n, b):
for perm in itertools.permutations(range(n)):
yield from partitions(perm, 1, b)
for x in distribute(5, 3):
print(x)
结果(对于n=5
和b=3
的720个元素中的一些,每个堆栈至少有一个元素(minim=1
)
如果你需要<代码>(堆栈,位置)<代码>格式,在后处理步骤中不难将结果转换成该格式。
一个不同的表示可能更简单:将不同的栈视为一个大堆栈中的区域,然后元素在堆栈上的分布可以被视为(a)所有元素的排列,以及(b)将该排列分成不同的堆栈。例如,对于n=5
和b=3
,排列的一个这样的分区可能是[4 3 | 1 | 2 5]
,即第一个堆栈是[4,3]
,第二个堆栈正好是[1]
,第三个堆栈是[2,5]
import itertools
def partitions(lst, minim, num_part):
if not lst and num_part == 0:
yield []
elif lst and num_part > 0:
for i in range(minim, len(lst) + 1):
for p in partitions(lst[i:], minim, num_part-1):
yield [lst[:i]] + p
def distribute(n, b):
for perm in itertools.permutations(range(n)):
yield from partitions(perm, 1, b)
for x in distribute(5, 3):
print(x)
结果(对于n=5
和b=3
的720个元素中的一些,每个堆栈至少有一个元素(minim=1
)
如果您需要
(stack,position)
格式,在后处理步骤中将结果转换为该格式应该不会太难。我的问题是,生成不存在的stacks订单没有意义。这意味着对于(0,1,1),它只有2个排列,就像我的问题一样。其次,还有什么比这更有效?是的,数字很大。我的问题是,生成不存在的堆栈订单没有意义。这意味着对于(0,1,1),它只有2个排列,就像我的问题一样。其次,还有什么比这更有效呢?是的,数字很大。谢谢你的回答。作为一个问题,我如何知道堆栈中最顶层的元素是您的格式。换句话说,我如何指向每组中的最后一个元素。另外,有一点很重要,我无法在你的例子中弄清楚:堆栈不是唯一的,所以顺序不重要,所以0 | 12和1 | 2 | 0是一样的,这是如何实现的?另外,你能用每个堆栈的最大数量而不是最小值来编辑代码吗?@SolvingPy对于最大数量,你可以在范围(最小值,最小值)上循环(maxim,len(lst))+1:
。对于“堆栈顺序不重要”的问题:不确定在生成堆栈时如何处理此问题,但您可以在后处理中创建一个组组的组。您能告诉我如何解决组后面有一个额外逗号的问题吗(例如这里[(0,),(1,2),(3,4)])的单个objects@SolvingPy这不是问题,这只是一个元素元组的打印(或创建)方式。记住(x)
只是x
,而(x,)
就像[x]
,就像一个元组
而不是一个列表
。谢谢你的回答。作为一个问题,我如何知道你格式的堆栈中最顶层的元素。换句话说,我如何指向每个组中的最后一个元素。另外,在你的情况下,有一点我无法理解:堆栈不是唯一的,所以顺序不同是不重要的,所以0 | 12与1 2 | 0是相同的。如何实现这一点?另外,您可以用每个堆栈的最大数量而不是最小值来编辑代码吗?@SolvingPy对于最大数量,您可以循环使用范围(最小值,最小值(最大值,len(lst))+1):
。对于“堆栈顺序不重要”事情:不知道在生成堆栈时如何处理这个问题,但您可以在后处理中创建一个排列的set
。您能告诉我如何解决组后面有一个额外逗号的问题吗(例如这里[(0,),(1,2),(3,4)])单身的objects@SolvingPy这不是一个问题,这只是如何打印(或创建)一个元素元组。请记住,(x)
只是x
,而(x,)
就像[x]
,就像元组而不是列表。