Python 3.x 如何在Python(最好是itertools)中生成列表的所有分组
如果我有一个序列,例如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位列表,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个项目,则列表项
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