Mar*_*rkV 3 wolfram-mathematica
设A和B是列表.我是要找到所有对{x,y}用于其x在A,y在B有的情况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}的这x1是A1... xn是An和Cond[x1,x2,...,xn]是真实的.
最后,是否有一个内置函数来计算两个或多个列表的笛卡尔积?
谢谢!
如果您需要检查所有对(即不存在对称使用减少的问题),那么最简单的可能是Select和Tuples:
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)
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)
希望这可以帮助.