Python 3.x 如何在Python(最好是itertools)中生成列表的所有分组

Python 3.x 如何在Python(最好是itertools)中生成列表的所有分组,python-3.x,Python 3.x,如果我有一个序列,例如1 2 3 4,我如何使用itertools从中生成以下组: (1) (2)(3)(4) (1)(2)(3)(4) (1) (2 3)(4) (1) (2)(3)(4) (1 2)(3 4) (1 2 3)(4) (1) (2 3 4) (1 2 3 4) 顺序不重要……我分组的方式是使用分隔符:最初我使用三个分隔符将它们分成四组,然后使用两个分隔符将它们分成三组(两种方式分成三组),依此类推 如果itertools无法实现,我可以如何生成它?如果列表中有n个项目,则列表项

如果我有一个序列,例如1 2 3 4,我如何使用itertools从中生成以下组:

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

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

(1) (2 3)(4)

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

(1 2)(3 4)

(1 2 3)(4)

(1) (2 3 4)

(1 2 3 4)

顺序不重要……我分组的方式是使用分隔符:最初我使用三个分隔符将它们分成四组,然后使用两个分隔符将它们分成三组(两种方式分成三组),依此类推

如果itertools无法实现,我可以如何生成它?

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

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
即组中元素的总和
*
组的长度


如何从上面的表单列表中获取值:(1+2+3)*1+(1+2)*2+(3)*1+(1)*1+(2+3)*2+(1+2+3)*3,即组中的元素之和*组的长度[如果这是一个简单的问题,很抱歉]@rjmessibarca将其添加到了答案中。根据您的说法,这是python中最有效的方法吗?不,如果没有广泛的测试,我决不会声称任何东西是“最有效的”,那将是荒谬的。
sum(sum(g)*len(g) for gs in generate_groupings([1,2,3]) for g in gs)
# 44