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个堆栈
  • 我关心它们在堆栈中的位置
例如,如果我们只关心它们在哪个堆栈中,并且我们有3个对象和2个堆栈,那么我们可以创建一个

(0,1,1)-这意味着对象1在堆栈0中,其余的在堆栈1中

生成所有的组合只是(0,0,0)(0,0,1)等等

如果我真的需要知道堆栈中的什么之上是什么,那么我就不能这样知道

我想的是还有一个堆栈顺序变量,所以对于(0,1,1)的情况,它是

((0,0),(1,0),(1,1))或((0,0),(1,1),(1,0)),因此每个变量的第一个变量是它所在的位置,第二个是它的顺序,0是最低的

如何在python中生成所有可能性?(因此,(0,1,1)将有2个置换,(1,1,1)将有6个置换)


我对((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]
,就像
元组而不是
列表。