如何用 "sum" 条件生成 itertools.product?

How to generate itertools.product with a "sum" condition?

我的代码是:

        import itertools
        a = [*range(22)], [*range(22)], [*range(22)], [*range(22)]

        combination = [seq for seq in itertools.product(*a) if sum(seq) <= 21]
        print(combination)

        lst1 = [item[0] for item in combination]
        lst2 = [item[1] for item in combination]
        lst3 = [item[2] for item in combination]
        lst4 = [item[3] for item in combination]

我的结果是:

"[......, (0, 0, 0, 19), (0, 0, 0, 20), (0, 0, 0, 21), (0, 0, 1, 0), (0, 0, 1, 1), (0, 0, 1, 2), (0, 0, 1, 3), (0, 0, 1, 4), ....., ( 0, 0, 1, 16), (0, 0, 1, 17), (0, 0, 1, 18), (0, 0, 1, 19), (0, 0, 1, 20),. ...]"

生成的可迭代集合中的上限是每个可迭代中的元素应小于或等于21。

但我想要的是每个 iterable 的前两个和最后两个元素的上限。

例如,如果当前上限结果为 (0, 0, 1, 20),因为它的总和为 21;我希望上限位于前两个和最后两个元素上,分别加到 21 上,结果为 (0, 21, 1, 20).

我该怎么做?

将问题解构为仅存在问题的子句。这与itertools.

无关
if sum(seq) <= 21

简单写下您描述的情况:

if sum(seq[:2] ) <= 21 and
   sum(seq[-2:]) <= 21

在我看来你真正需要的是这个:

import itertools

combinations = [
    seq
    for seq in itertools.product(*itertools.tee(range(22), 4))
    if sum(seq[:2]) == 21 and sum(seq[-2:]) == 21
]
print(combinations)

lst1 = [item[0] for item in combinations]
lst2 = [item[1] for item in combinations]
lst3 = [item[2] for item in combinations]
lst4 = [item[3] for item in combinations]

正如您所说,当 seq 的前 2 个或后 2 个元素之和等于 21 时,您希望上限为 21,而不是小于或等于。