Fid*_*idd 4 python combinations list python-itertools
让我们假设我有一个整数列表:
mylist = [101, 102, 103, 104, 105, 106]
Run Code Online (Sandbox Code Playgroud)
现在我需要创建每个可能的子列表分区(保留顺序):
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])]
Run Code Online (Sandbox Code Playgroud)
任何的想法?将itertools是有益的?
您正在创建切片点;您是否在当前元素之后切片。您可以使用布尔值生成这些:
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
Run Code Online (Sandbox Code Playgroud)
演示:
>>> 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]]]
Run Code Online (Sandbox Code Playgroud)
如果要删除最后一个条目(包含一个列表,其中只有一个列表,又包含所有元素),请将最后两行替换为:
if start:
slices.append(lst[start:])
yield slices
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
688 次 |
| 最近记录: |