我需要迭代所有可能的组合,将初始可迭代的元素放入多个桶中。
说明:将
ABCDEFG
放入两个长度为3
和2
的桶中 -->
[ABC, DE], [ABC, DF], [ABC, DG], [ABD, CE], [ABD, EF], ..., [CDE, FG]
没有重复,每个桶中只有唯一的组合(无排列)。
我想我应该以某种方式使用 itertools.combinations():
itertools.combinations('ABCDEFG', 3) --> ABC, ABD, ..., EFG
或将其与某些东西结合起来。
但是我正在努力弄清楚如何将输出进一步分配到不同长度的多个桶。
感谢@Tim Roberts:
桶大多是无关紧要的。只需选择所有组合 长度 5. 使用前 3 个和后 2 个
这只是一个实现。
from itertools import combinations
elements = "ABCDEFG"
lst = [["".join(i[:3]), "".join(i[3:])] for i in combinations(elements, r=5)]
print(lst)
输出:
[['ABC', 'DE'], ['ABC', 'DF'], ['ABC', 'DG'], ['ABC', 'EF'], ['ABC', 'EG'], ['ABC', 'FG'], ['ABD', 'EF'], ['ABD', 'EG'], ['ABD', 'FG'], ['ABE', 'FG'], ['ACD', 'EF'], ['ACD', 'EG'], ['ACD', 'FG'], ['ACE', 'FG'], ['ADE', 'FG'], ['BCD', 'EF'], ['BCD', 'EG'], ['BCD', 'FG'], ['BCE', 'FG'], ['BDE', 'FG'], ['CDE', 'FG']]
这是可能的实现,它依赖于“样本空间”的元素是可散列的。
import itertools
from typing import Iterable, Iterator, TypeVar
_T = TypeVar("_T")
def two_bin_combs(
space: Iterable[_T], b1: int, b2: int
) -> Iterator[tuple[tuple[_T, ...], tuple[_T, ...]]]:
for pool in itertools.combinations(space, b1 + b2):
pool_set = set(pool)
for left in itertools.combinations(pool, b1):
yield left, tuple(pool_set.difference(left))
然后
sample_space = "ABCDEFG"
print(list(itertools.islice(two_bin_combs(sample_space, 3, 2), 5)))
输出
[
(('A', 'B', 'C'), ('E', 'D')),
(('A', 'B', 'D'), ('C', 'E')),
(('A', 'B', 'E'), ('C', 'D')),
(('A', 'C', 'D'), ('E', 'B')),
(('A', 'C', 'E'), ('D', 'B'))
# ...
]