首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用Python生成列表的所有分组(最好是迭代工具)

如何用Python生成列表的所有分组(最好是迭代工具)
EN

Stack Overflow用户
提问于 2016-09-25 06:18:23
回答 1查看 84关注 0票数 2

如果我有一个序列,例如1,2,3,4,如何使用迭代工具从它生成以下组:

(1) (2) (3) (4)

(1 ) (3) (4)

(1) (2 )( 3) (4)

(1) (2) (3 )

(1 2) (3 4)

(1 2 3) (4)

(1) (2 3 4)

(1 2 3 4)

我分组的顺序不是用分离器:最初我用三个分离器把它们分成四组,然后用两个分离器把它们分成三组(两种方法分成三组)等等。

如果迭代工具是不可能的,我还能如何生成它呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-25 06:54:57

对于列表中的n项,列表项之间存在n-1位置,其中可能存在分离,也可能没有分离。因此,我们可以让每个分组对应于一个n-1位列表,其中0表示分离,1表示不分离。

代码语言:javascript
复制
def generate_groupings(xs):
    for bits in range(2 ** (len(xs)-1)):  # int representing n-1 bits
        grouping = [(xs[0],)]             # grouping starts with first item
        for x in xs[1:]:                  # for each remaining item...
            bits, b = divmod(bits, 2)     # pop one bit off of the list
            if b:                         # case 1: no separation
                grouping = grouping[:-1] + [grouping[-1] + (x,)]
            else:                         # case 0: separation
                grouping += [(x,)]
        yield grouping        

list(generate_groupings([1,2,3]))
# [[(1,), (2,), (3,)], [(1, 2), (3,)], [(1,), (2, 3)], [(1, 2, 3)]]

回答你的后续问题

如何从上面的表单列表中获得一个值:(1+2+3)*1 + (1+2)*2 + (3)*1 + (1)*1 + (2+3)*2 +(1+2+3)*3,即组*长度中元素的和

代码语言:javascript
复制
sum(sum(g)*len(g) for gs in generate_groupings([1,2,3]) for g in gs)
# 44
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39684026

复制
相关文章

相似问题

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