python - 如何从多个设置值到达一个产品 - Python

标签 python python-3.x

我有 3 组:

A = [0, 10, 20]
B = [5, 10, 15]
C = [2, 5]

我正在运行以下列表理解以了解笛卡尔乘积如何匹配目标值 40。

from itertools import product

xx = [p for p in (product(A, B, C)) if sum(p) == 40]

print(list(xx))

给出结果

[(20, 15, 5)]

以上结果是从每组中抽取1个图形来完成目标值。我想从 A 和 B 中提取 2 个数字,并从 C 中提取 1 个数字以获得这个结果。我怎样才能改变我的解决方案以获得如下结果:

[(0, 20, 5, 10, 5]

最佳答案

如何考虑 A x A x B x B x C 的笛卡尔积?

xx = [list(p) for p in product(A, A, B, B, C) if sum(p) == 40 and p[0] != p[1] and p[2] != p[3]]
print(xx)

这给了我们

[[0, 10, 10, 15, 5], [0, 10, 15, 10, 5], [0, 20, 5, 10, 5], [0, 20, 10, 5, 5],
[10, 0, 10, 15, 5], [10, 0, 15, 10, 5], [20, 0, 5, 10, 5], [20, 0, 10, 5, 5]]

如果您不想考虑对从 AB 中选择的 2 个元素进行排序,您可以对它们的“选择”进行排序并构造一个 最终结果的集合:

xx_unique = set([tuple(sorted(p[:2]) + sorted(p[2:4]) + p[4:]) for p in xx])
print(xx_unique)
# {(0, 10, 10, 15, 5), (0, 20, 5, 10, 5)}

注意:正如@MadPhysicist 所指出的,如果您的列表中有重复项,您可能需要首先考虑索引的乘积,然后重建您想要的 5 元组:

xxi = [p for p in product(range(len(A)), range(len(A)), range(len(B)), range(len(B)), range(len(C))) if p[0] != p[1] and p[2] != p[3]]

xx = [ [A[i], A[j], B[k], B[l], C[m]] for i, j, k, l, m in xxi if sum([A[i], A[j], B[k], B[l], C[m]]) == 40 ]

关于python - 如何从多个设置值到达一个产品 - Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52901864/

相关文章:

python-3.x - 在python中用零替换所有列中的所有负值

python - 尝试打开json文件的UnicodeDecodeError

python-3.x - 将谷歌存储桶中的所有 .csv 文件读取到一个 Pandas df 中,然后以 .csv 格式保存回另一个存储桶

python - 获取条形图的颜色matplotlib

python-3.x - 用 Python 和 Beautiful Soup 抓取分页

python - 如何让 Flask 记录到 stdout 而不是 stderr?

python - 使用多个 y 值进行插值

python - 数据集的每个变量的 seaborn.boxplot

python - 奇怪的 OpenCV .read() 挂起没有错误

python - 尝试使用 Matplotlib 设置绘图字体时出错