找到满足一定条件的对的有效方法

Mar*_*rkV 3 wolfram-mathematica

AB是列表.我是要找到所有对{x,y}用于其xA,yB有的情况Cond[x,y]是真实的.这是我想出来的,但它非常麻烦,我怀疑有更好的方法

AllPairs[A_, B_, Cond_] := Module[{i, k, C, Cp},
  C = {};
  For[i = 1, i <= Length[A], i++,
  Cp = Select[B, Cond[A[[i]], #] &];
  C = C~Join~Table[{A[[i]], Cp[[k]]}, {k, 1, Length[Cp]}];
 ];
Return[C];
]
Run Code Online (Sandbox Code Playgroud)

例如

In[1]:= AllPairs[{1, 2, 3, 4}, {3, 4, 5}, EvenQ[#1 + #2] &]
Out[1]:= {{1, 3}, {1, 5}, {2, 4}, {3, 3}, {3, 5}, {4, 4}}
Run Code Online (Sandbox Code Playgroud)

我对此代码的另一个问题是它不容易概括.我想有一个函数,它接受在列表A1, A2,...,An和一些条件Cond[x___]和输出所有n元组{x1,x2,...,xn}的这x1A1... xnAnCond[x1,x2,...,xn]是真实的.

最后,是否有一个内置函数来计算两个或多个列表的笛卡尔积

谢谢!

Jan*_*nus 6

如果您需要检查所有对(即不存在对称使用减少的问题),那么最简单的可能是SelectTuples:

allPairs[a_,b_,cond_]:=Select[Tuples@{a,b},cond@@#&];
Run Code Online (Sandbox Code Playgroud)

这就是我认为你想要的:

a=Range[4]; b=Range[3,5];
allPairs[a,b,EvenQ[#1+#2]&]
Out[37]= {{1,3},{1,5},{2,4},{3,3},{3,5},{4,4}}
Run Code Online (Sandbox Code Playgroud)

至于生成对的更多工具查找TuplesOuter:

Tuples[a,2] (* 2-tuples with entries from a *)
Tuples[{a,b}] (* 2-tuples with firt (2nd) entry from a (b) *)
Outer[List,a,b] (* cartesian product *)
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.