Python:将列表分解为所有可能的子列表

标签 python list combinations itertools

让我们假设我有一个整数列表:

mylist = [101, 102, 103, 104, 105, 106]

现在我需要创建每个可能的子列表分区(保留顺序):
sublists = [([101], [102, 103, 104, 105, 106]),
            ([101, 102], [103, 104, 105, 106]),
            ([101, 102, 103], [104, 105, 106]),
            ...
            ([101, 102], [103, 104], [105, 106]),
            ...
            ([101], [102, 103, 104], [105], [106]),
            ...
            ([101], [102], [103], [104], [105], [106])]

任何的想法?会 itertools有帮助吗?

最佳答案

您正在创建切片点;您是否在当前元素之后切片。您可以使用 bool 值生成这些:

from itertools import product

def sublists(lst):
    for doslice in product([True, False], repeat=len(lst) - 1):
        slices = []
        start = 0
        for i, slicehere in enumerate(doslice, 1):
            if slicehere:
                slices.append(lst[start:i])
                start = i
        slices.append(lst[start:])
        yield slices

演示:
>>> from pprint import pprint
>>> mylist = [101, 102, 103, 104, 105, 106]
>>> pprint(list(sublists(mylist)))
[[[101], [102], [103], [104], [105], [106]],
 [[101], [102], [103], [104], [105, 106]],
 [[101], [102], [103], [104, 105], [106]],
 [[101], [102], [103], [104, 105, 106]],
 [[101], [102], [103, 104], [105], [106]],
 [[101], [102], [103, 104], [105, 106]],
 [[101], [102], [103, 104, 105], [106]],
 [[101], [102], [103, 104, 105, 106]],
 [[101], [102, 103], [104], [105], [106]],
 [[101], [102, 103], [104], [105, 106]],
 [[101], [102, 103], [104, 105], [106]],
 [[101], [102, 103], [104, 105, 106]],
 [[101], [102, 103, 104], [105], [106]],
 [[101], [102, 103, 104], [105, 106]],
 [[101], [102, 103, 104, 105], [106]],
 [[101], [102, 103, 104, 105, 106]],
 [[101, 102], [103], [104], [105], [106]],
 [[101, 102], [103], [104], [105, 106]],
 [[101, 102], [103], [104, 105], [106]],
 [[101, 102], [103], [104, 105, 106]],
 [[101, 102], [103, 104], [105], [106]],
 [[101, 102], [103, 104], [105, 106]],
 [[101, 102], [103, 104, 105], [106]],
 [[101, 102], [103, 104, 105, 106]],
 [[101, 102, 103], [104], [105], [106]],
 [[101, 102, 103], [104], [105, 106]],
 [[101, 102, 103], [104, 105], [106]],
 [[101, 102, 103], [104, 105, 106]],
 [[101, 102, 103, 104], [105], [106]],
 [[101, 102, 103, 104], [105, 106]],
 [[101, 102, 103, 104, 105], [106]],
 [[101, 102, 103, 104, 105, 106]]]

如果要删除最后一个条目(包含一个列表,其中只有一个列表,又包含所有元素),请将最后两行替换为:
if start:
    slices.append(lst[start:])
    yield slices

关于Python:将列表分解为所有可能的子列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36470726/

相关文章:

C++ STL算法(列表排序)OpenMP/多线程实现

c - C 中的简单结构程序

c# 将 winforms 图表绑定(bind)到对象列表

python - 对任意数量的数组的所有可能组合求和并应用限制

Python列表列表的所有组合

Python 2.7 - 使用多个字典的字符串替换

python - 如何在 Pandas 中选择 'last business day of the month'?

python - PIL 在 OpenCV 图像中产生灰色像素

java - Python属性错误 'Map'对象没有属性 'cells'

algorithm - 如何打印多个字符的所有可能组合?