如何用 "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,而不是小于或等于。
我的代码是:
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,而不是小于或等于。