Wolfram mathematica 寻找满足一定条件的对的有效方法

Wolfram mathematica 寻找满足一定条件的对的有效方法,wolfram-mathematica,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]]

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];
]
我对这段代码的另一个问题是它不容易泛化。我想要一个函数,它接受列表
A1,A2,…,一个
和一些条件
Cond[x_uuuuu]
,并输出
x1
A1
中的所有n元组
{x1,x2,…,xn}
xn
An
中,并且
Cond[x1,x2,…,xn]
为真

最后,是否有一个内置函数,用于计算两个或多个列表的长度


谢谢

如果您需要检查所有对(即,没有用于减少问题的对称性),那么最简单的方法可能是
选择
元组

allPairs[a_,b_,cond_]:=Select[Tuples@{a,b},cond@@#&];
这正是我认为你想要的:

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}}
关于生成配对的更多工具,请查阅:


希望这能有所帮助。

另一种解决方案使用了
ReplaceList
——它比Janus的答案慢4倍(比原来的方法慢3倍),但可能内存效率更高

In[1]:= allPairs1[a_,b_,cond_]:=Select[Tuples@{a,b},cond@@#&];
In[2]:= allPairs2[a_,b_,cond_]:=ReplaceList[{a,b},
                                  {{___,x_,___},{___,y_,___}}/;cond[x,y]:>{x,y}]

In[3]:= aa=RandomInteger[{0,10^5},{1000}];
In[4]:= bb=RandomInteger[{0,10^5},{1000}];

In[5]:= test1=allPairs1[aa,bb,EvenQ[#1+#2]&];//Timing
Out[5]= {4.99,Null}

In[6]:= test2=allPairs2[aa,bb,EvenQ[#1+#2]&];//Timing
Out[6]= {19.12,Null}

In[7]:= test1==test2
Out[7]= True

对于这样的问题,我个人喜欢使用用例并附加条件。不过,我不确定效率如何

lst1 = {1, 2, 3, 4};
lst2 = {3, 4, 5};
Cases[Tuples[{lst1, lst2}], {x_, y_} /; EvenQ[x + y]]
我发现这种方法简单且通用,至少对于小列表(我使用的类型!)


啊!<代码>元组
正是我所需要的(没有仔细阅读帮助文件)。谢谢
In[1]:= allPairs1[a_,b_,cond_]:=Select[Tuples@{a,b},cond@@#&];
In[2]:= allPairs2[a_,b_,cond_]:=ReplaceList[{a,b},
                                  {{___,x_,___},{___,y_,___}}/;cond[x,y]:>{x,y}]

In[3]:= aa=RandomInteger[{0,10^5},{1000}];
In[4]:= bb=RandomInteger[{0,10^5},{1000}];

In[5]:= test1=allPairs1[aa,bb,EvenQ[#1+#2]&];//Timing
Out[5]= {4.99,Null}

In[6]:= test2=allPairs2[aa,bb,EvenQ[#1+#2]&];//Timing
Out[6]= {19.12,Null}

In[7]:= test1==test2
Out[7]= True
lst1 = {1, 2, 3, 4};
lst2 = {3, 4, 5};
Cases[Tuples[{lst1, lst2}], {x_, y_} /; EvenQ[x + y]]
Cases[Tuples[{lst1, lst2}], {x_ /; EvenQ[x], y_ /; OddQ[y]}]