如何将元素放入几个桶中(可能使用itertools.combinations())?

问题描述 投票:0回答:2

我需要迭代所有可能的组合,将初始可迭代的元素放入多个桶中。
说明:将

ABCDEFG
放入两个长度为
3
2
的桶中 -->

[ABC, DE], [ABC, DF], [ABC, DG], [ABD, CE], [ABD, EF], ..., [CDE, FG]

没有重复,每个桶中只有唯一的组合(无排列)。

我想我应该以某种方式使用 itertools.combinations():

itertools.combinations('ABCDEFG', 3) --> ABC, ABD, ..., EFG

或将其与某些东西结合起来。

但是我正在努力弄清楚如何将输出进一步分配到不同长度的多个桶

python combinations python-itertools
2个回答
0
投票

感谢@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']]

0
投票

这是可能的实现,它依赖于“样本空间”的元素是可散列的。

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'))
    # ...
]
© www.soinside.com 2019 - 2024. All rights reserved.