首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在列表中查找所有可能的有序组

在列表中查找所有可能的有序组
EN

Stack Overflow用户
提问于 2015-06-29 12:32:20
回答 1查看 145关注 0票数 4

给定整数的有序列表:

代码语言:javascript
运行
复制
[1,3,7,8,9]

如何才能找到从原始列表中创建的所有子列表?使用上面的示例,我正在寻找一种以编程方式生成这些序列的方法:

代码语言:javascript
运行
复制
[[1],[3,7,8,9]]
[[1, 3],[7,8,9]]
[[1, 3, 7],[8,9]]
[[1, 3, 7, 8],[9]]
[[1, 3, 7, 8, 9]]
[[1, 3, 7], [8, 9]]
[[1], [3, 7], [8], [9]]
[[1], [3], [7, 8], [9]]
[[1], [3], [7], [8, 9]]
...

我基本上是在寻找一种方法来生成一个列表的所有排列,其中的顺序是维持的。在总共只有两个子列表的情况下,我可以生成所有的子列表,使用以下代码:

代码语言:javascript
运行
复制
def partition(arr, idx):
    return [arr[:idx], arr[idx:]]

l = [1,3,7,8,9]
for idx in range(1, len(l)):
    groups = partition(l, idx)
    print(groups)

[[1], [3, 7, 8, 9]]
[[1, 3], [7, 8, 9]]
[[1, 3, 7], [8, 9]]
[[1, 3, 7, 8], [9]]

但是,此代码段只将原始列表分成两部分,并生成所有可能的子列表,其中只有两个子列表。如何生成所有可能的子列表,这些子列表可以从维护顺序的原始列表中创建?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-29 12:40:01

不如:

代码语言:javascript
运行
复制
import itertools

def subsets(seq):
    for mask in itertools.product([False, True], repeat=len(seq)):
        yield [item for x, item in zip(mask, seq) if x]

def ordered_groups(seq):
    for indices in subsets(range(1, len(seq))):
        indices = [0] + indices + [len(seq)]
        yield [seq[a:b] for a,b in zip(indices, indices[1:])]

for group in ordered_groups([1,3,7,8,9]):
    print group

结果:

代码语言:javascript
运行
复制
[[1, 3, 7, 8, 9]]
[[1, 3, 7, 8], [9]]
[[1, 3, 7], [8, 9]]
[[1, 3, 7], [8], [9]]
[[1, 3], [7, 8, 9]]
[[1, 3], [7, 8], [9]]
[[1, 3], [7], [8, 9]]
[[1, 3], [7], [8], [9]]
[[1], [3, 7, 8, 9]]
[[1], [3, 7, 8], [9]]
[[1], [3, 7], [8, 9]]
[[1], [3, 7], [8], [9]]
[[1], [3], [7, 8, 9]]
[[1], [3], [7, 8], [9]]
[[1], [3], [7], [8, 9]]
[[1], [3], [7], [8], [9]]
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31115816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档