python - 以各种可能的方式连接列表元素

时间:2015-12-08 18:54:14

标签: python combinations nested-lists

我的问题可能很难解释(也许这也是我找不到解决方案或类似问题的原因)。

我所拥有的是包含一些元素的列表(在我的特定情况下也列出了列表)。 我想要的是以相同的顺序使这个列表的所有可能的连接组合。

例如:

[[1], [2], [3], [4]]  # what I have

{                     # what I want
    [[1], [2], [3], [4]],
    [[1, 2], [3], [4]],
    [[1], [2, 3], [4]],
    [[1], [2], [3, 4]],
    [[1, 2], [3, 4]],  # Update 1
    [[1, 2, 3], [4]],
    [[1], [2, 3, 4]],
    [[1, 2, 3, 4]]
}

一般来说,子列表的长度大于1;该列表本身可能有4个以上的元素。

非常感谢任何帮助。

更新1: 在代码中添加了缺少的组合。

1 个答案:

答案 0 :(得分:4)

试试这个:

def concats(l):
    if len(l) < 2:
        return [l]

    return [[l[0]] + x for x in concats(l[1:])] + \
           concats([l[0] + l[1]] + l[2:])

以下是一个示例案例:

l = [[1], [2], [3], [4]]
r = concats(l)

结果:

[[[1], [2], [3], [4]],
 [[1], [2], [3, 4]],
 [[1], [2, 3], [4]],
 [[1], [2, 3, 4]],
 [[1, 2], [3], [4]],
 [[1, 2], [3, 4]],
 [[1, 2, 3], [4]],
 [[1, 2, 3, 4]]]

编辑:我不清楚应该如何处理空列表,但是在这种情况下你可能只想返回一个空列表而不将它包装在外部列表中 - 我会把这个案例留给你。函数顶部的简单检查可以按照您选择的任何方式处理它(并且它不会影响较大的情况)。