Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 列表的子列表_Python - Fatal编程技术网

Python 列表的子列表

Python 列表的子列表,python,Python,我想要一个函数split_list([1,2,4,3]),它生成以下7个列表: [[1], [2,4,3]] [[1,2], [4,3]] [[1,2,4], [3]] [[1,2], [4],[3]] [[1],[2,4],[3]] [[1],[2],[4,3]] [[1],[2],[4],[3]] 如果先生成较小的列表-[[1],[2,4,3]]的长度为2,而[[1],[2],[4],[3]]的长度为4,因此最后生成。这就是我所能做到的: def split_list(l): for

我想要一个函数
split_list([1,2,4,3])
,它生成以下7个列表:

[[1], [2,4,3]]
[[1,2], [4,3]]
[[1,2,4], [3]]
[[1,2], [4],[3]]
[[1],[2,4],[3]]
[[1],[2],[4,3]]
[[1],[2],[4],[3]]
如果先生成较小的列表-
[[1],[2,4,3]]
的长度为2,而
[[1],[2],[4],[3]]
的长度为4,因此最后生成。这就是我所能做到的:

def split_list(l):
  for i in range(1, len(l)):
    yield [l[:i],l[i:]]

for i in split_list((1,2,4,3)):
    print(i)

您可以使用递归的列表切片:

def split_list(d):
   for i in range(len(d)):
      if len(d[i+1:]) > 0:
        for c in split_list(d[i+1:]):
          yield [d[:i+1], *c]
      else:
        yield [d]

print(list(split_list([1,2,4,3])))
输出:

[[[1], [2], [4], [3]], [[1], [2], [4, 3]], [[1], [2, 4], [3]], [[1], [2, 4, 3]], [[1, 2], [4], [3]], [[1, 2], [4, 3]], [[1, 2, 4], [3]], [[1, 2, 4, 3]]]
[[[1], [2], [4], [3]], [[1], [2], [4, 3]], [[1], [2, 4], [3]], [[1], [2, 4, 3]], [[1, 2], [4], [3]], [[1, 2], [4, 3]], [[1, 2, 4], [3]], [[1, 2, 4, 3]]]
编辑:事件较短

def split_list(d):
  if len(d) > 1:
    return [list(filter(None, [d[:i+1], *c])) for i in range(len(d)) for c in split_list(d[i+1:])]
  return [d] if not isinstance(d, list) else [[d]]
输出:

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

如果将列表本身作为第一个元素不成问题,可以这样做:

def split_list(lst):
    if not lst:
        yield []

    for i in range(len(lst), 0, -1):
        for j in split_list(lst[i:]):
            yield [lst[:i]] + j


for l in split_list([1, 2, 4, 3]):
    print(l)
输出

[[1, 2, 4, 3]]
[[1, 2, 4], [3]]
[[1, 2], [4, 3]]
[[1, 2], [4], [3]]
[[1], [2, 4, 3]]
[[1], [2, 4], [3]]
[[1], [2], [4, 3]]
[[1], [2], [4], [3]]
试试这个:

def split_list(l):
    if len(l) == 1:
        yield [ l ]
        return

    for s in split_list(l[1:]):
        for n, sub in enumerate(s):
            if len((s[:n] + [[ l[0] ] + sub]  + s[n+1:])[0]) !=4:
                yield s[:n] + [[ l[0] ] + sub]  + s[n+1:]           
        yield [[l[0]]] + s

for lst in split_list([1, 2, 3, 4]):
        print lst
这个问题是递归解决的。 在产量方面:

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

较小的列表是什么意思?@RobS的[[1]、[2,4,3]]的长度是2,而[[1]、[2]、[4]、[3]]的长度是4。可能重复:或者:是否要将主列表排除为第一个元素?例如[[1,2,3,4]]很好!!*in*c是做什么的?打开列表?@RobS是的,没错<代码>*c是简单的解包。我认为将列表与
+
连接起来有点干净(尽管这有点主观)。