Python 列表列表的排列

Python 列表列表的排列,python,combinations,permutation,pseudocode,Python,Combinations,Permutation,Pseudocode,假设有一个元素列表。其中每个列表可以有任意数量的元素。例如[[1,2,3,4],[2,3],[4,5,6,7],[1]。我正在尝试生成这种列表的排列,在这种排列中,我应该只从最里面的列表中选择一个。所以输出将是[1,2,4,1],[1,3,4,1] 示例输入=[[1,2],[3],[4] 示例输出=[[1,3,4],[2,3,4]] 我之前试过一些逻辑有缺陷的代码。以下是我中途陷入困境的代码。我无法找到一种方法来解决它。我不擅长排列和组合 我所尝试的与上面描述的相同,只是以下是一组坐标。i、 e

假设有一个元素列表。其中每个列表可以有任意数量的元素。例如
[[1,2,3,4],[2,3],[4,5,6,7],[1]
。我正在尝试生成这种列表的排列,在这种排列中,我应该只从最里面的列表中选择一个。所以输出将是[1,2,4,1],[1,3,4,1]

示例输入=
[[1,2],[3],[4]

示例输出=
[[1,3,4],[2,3,4]]

我之前试过一些逻辑有缺陷的代码。以下是我中途陷入困境的代码。我无法找到一种方法来解决它。我不擅长排列和组合

我所尝试的与上面描述的相同,只是以下是一组坐标。i、 e最里面的元素(输入中)是一组坐标

def perm(a,长度):
arr=[]
k=0

而(k您可以使用以下工具轻松完成此操作:

根据文档,无需任何
导入
s的近似等效实现:

def product(*args, **kwds):
    # product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy
    # product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111
    pools = map(tuple, args) * kwds.get('repeat', 1)
    result = [[]]
    for pool in pools:
        result = [x+[y] for x in result for y in pool]
    for prod in result:
        yield tuple(prod)

您可以使用以下工具轻松完成此操作:

根据文档,无需任何
导入
s的近似等效实现:

def product(*args, **kwds):
    # product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy
    # product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111
    pools = map(tuple, args) * kwds.get('repeat', 1)
    result = [[]]
    for pool in pools:
        result = [x+[y] for x in result for y in pool]
    for prod in result:
        yield tuple(prod)

我发现以下递归版本比使用列表理解的版本更具可读性,但我想这是一个品味问题:

def cartesianProduct( *lists ) :
    if not lists : # nothing to do, yield empty tuple
        yield ()
    else : # let's do A x cartesianProduct( B x C x ... )
        for a in lists[0] : # each element of A
            for tup in cartesianProduct( *lists[1:] ) : # each tuple of ( B x C x ... )
                yield ( a, ) + tup # concatenate and yield 

list( product( 'AB', range(3), 'xy' ) ) == list( cartesianProduct('AB', range(3), 'xy') )

True 

我发现以下递归版本比使用列表理解的版本更具可读性,但我想这是一个品味问题:

def cartesianProduct( *lists ) :
    if not lists : # nothing to do, yield empty tuple
        yield ()
    else : # let's do A x cartesianProduct( B x C x ... )
        for a in lists[0] : # each element of A
            for tup in cartesianProduct( *lists[1:] ) : # each tuple of ( B x C x ... )
                yield ( a, ) + tup # concatenate and yield 

list( product( 'AB', range(3), 'xy' ) ) == list( cartesianProduct('AB', range(3), 'xy') )

True 

有些人肯定会从中受益,但我想知道它是如何实现的。Python有一个几乎可以做任何事情的模块:)+1如果你不想导入
itertools
(到底为什么不呢?Python自带电池-使用电池),如果你真的阅读了我链接的页面,你会看到一个没有任何导入的大致相同的实现。我试图用c编写一个更大的问题的代码,但其中的一部分我是用python编写的,因为我想使用字典。我试图解决一个问题,我必须在网格中找到字符串。我已经完成了剩下的部分,但是我被困在这里了。如果你想要一个C实现,为什么还要问呢?如果您使用的是Python,请使用它;一个丰富的标准图书馆是它最好的功能之一。我在一个非常慢的互联网上工作,有50个人共享一个wifi。页面将加载未格式化的文本。对我来说,浏览你的更新有点困难。如果我必须用c语言实现的话,我通常会尝试用python做一些工作并用c语言实现。这是作业的一部分。谢谢,我将从这里开始工作。有些人肯定会从中受益,但我想知道如何实现它。Python有一个几乎可以做任何事情的模块:)+1如果您不想导入
itertools
(到底为什么不呢?Python自带电池-使用电池),如果你真的阅读了我链接的页面,你会看到一个没有任何导入的大致相同的实现。我试图用c编写一个更大的问题的代码,但其中的一部分我是用python编写的,因为我想使用字典。我试图解决一个问题,我必须在网格中找到字符串。我已经完成了剩下的部分,但是我被困在这里了。如果你想要一个C实现,为什么还要问呢?如果您使用的是Python,请使用它;一个丰富的标准图书馆是它最好的功能之一。我在一个非常慢的互联网上工作,有50个人共享一个wifi。页面将加载未格式化的文本。对我来说,浏览你的更新有点困难。如果我必须用c语言实现的话,我通常会尝试用python做一些工作并用c语言实现。这是作业的一部分。谢谢,我会从这里开始。
def cartesianProduct( *lists ) :
    if not lists : # nothing to do, yield empty tuple
        yield ()
    else : # let's do A x cartesianProduct( B x C x ... )
        for a in lists[0] : # each element of A
            for tup in cartesianProduct( *lists[1:] ) : # each tuple of ( B x C x ... )
                yield ( a, ) + tup # concatenate and yield 

list( product( 'AB', range(3), 'xy' ) ) == list( cartesianProduct('AB', range(3), 'xy') )

True