Python将iterable拆分为组合

Python将iterable拆分为组合,python,Python,给定一个iterable'ABCD',我想得到所有(1,3)对,例如: ('A', 'BCD'), ('B', 'ACD'), ('C', 'ABD'), ('D', 'ABC') 我发现了itertools.composition,但是,它只能给出['BCD','ACD','ABD','ABC'],不包括1部分 在python中有没有一种简单的方法可以做到这一点?如何: x = 'ABCD' [(x[i], x[:i] + x[i+1:]) for i in range(len(x))] #

给定一个iterable
'ABCD'
,我想得到所有
(1,3)
对,例如:

('A', 'BCD'),
('B', 'ACD'),
('C', 'ABD'),
('D', 'ABC')
我发现了
itertools.composition
,但是,它只能给出
['BCD','ACD','ABD','ABC']
,不包括
1
部分

在python中有没有一种简单的方法可以做到这一点?

如何:

x = 'ABCD'
[(x[i], x[:i] + x[i+1:]) for i in range(len(x))]
# Outputs:
# [('A', 'BCD'), ('B', 'ACD'), ('C', 'ABD'), ('D', 'ABC')]

最简单的方法是使用集合差异来识别被生成的组合排除的零件:

>>> from itertools import combinations
>>> population = set('ABCD')
>>> for group in combinations(population, 3):
        remainder = population.difference(group)
        result = ''.join(remainder), ''.join(group)
        print(result)

('D', 'ACB')
('B', 'ACD')
('C', 'ABD')
('A', 'CBD')
这种技术适用于分区,而不仅仅是
(1,3)
。例如,下面是
(2,3)
分区:

>>> population = set('ABCDE')
>>> for group in combinations(population, 3):
    remainder = population.difference(group)
    result = ''.join(remainder), ''.join(group)
    print(result)


('ED', 'ACB')
('BD', 'ACE')
('BE', 'ACD')
('CD', 'ABE')
('CE', 'ABD')
('CB', 'AED')
('AD', 'CBE')
('AE', 'CBD')
('AB', 'CED')
('AC', 'BED')

对于
(1,3)
,您不需要
组合
;直接迭代
填充
会得到
中的单例项,
余数
是剩余的三元组。这对StackOverflow更有用,一个简单的特例的答案,或者一个适用于各种情况并展示如何有效使用语言的通用解决方案?我认为将实际问题中的场景称为“简单”特例是冒昧的。如果这是所需的输出,则无需调用不必要的函数调用。在保证的情况下使用
组合
加入
无效。串接字符串的片段将为范围(len(x))内的i提供字符串
>>[(x[i],x[:i]+x[i+1:])]
[('A','BCD'),('B','ACD'),('C','ABD'),('D','ABC'),('D','ABC')]