作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有 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]]
如果您不想考虑对从 A
和 B
中选择的 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/
我有一个流 randStream,它每半秒发出一次随机值,还有一个 boolStream,它将值从 randStream 转换为 bool 值。 let randStream = Kefir.from
我是一名优秀的程序员,十分优秀!