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是简单的解包。我认为将列表与
+
连接起来有点干净(尽管这有点主观)。