Python将iterable拆分为组合
给定一个iterablePython将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))] #
'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')]