检查列表是否是另一个列表的一部分

时间:2012-10-17 21:54:12

标签: list wolfram-mathematica segment

我想在Mathematica中创建一个模块,如果第一个列表(L1)在第二个列表(L2)中,假设L2的长度大于L1的长度,则返回true。 我是这样做的,问题是总是返回False,我不知道为什么。 编辑:我已经解决了一个问题:我写了“if”而不是“If”。现在我得到一个无限循环。

isSegment[L1_List, L2_List] := Module[{i, j},   For[i = 1, i + Length[L1] - 1 <= Length[L2],
       For[j = 1, j <= Length[L1],
    If[L2[[i + j - 1]] != L1[[j]], Break;];
    j++;
    ];
       If[j == Length[L1] + 1,
    Return[ True];];
       i++;    ];   Return [False];   ]

2 个答案:

答案 0 :(得分:4)

这可能是最干净,最快的一般方法之一:

isSegment[{L1__}, L2_List] := MatchQ[L2, {___, L1, ___}]

isSegment[{3, 4, 5}, Range@10]
True

要获取所有RealInteger值的列表,您可以调整here显示的方法以获得最大速度。


用户写道:

  

谢谢,这是一个好方法,但我想要的是纠正我的代码而不是新代码,因为它是学校的练习,并且在声明中我们必须使用For循环。

Break[]的语法和Return的功能似乎存在混淆。为了更正代码,我将Break替换为Break[],将Return替换为Throw&amp; Catch

isSegment[L1_List, L2_List] :=
 Catch @ Module[{i, j},
   For[i = 1, i + Length[L1] - 1 <= Length[L2],
    For[j = 1, j <= Length[L1], 
     If[L2[[i + j - 1]] != L1[[j]], Break[];]; j++;];
    If[j == Length[L1] + 1, Throw[True];];
    i++;]; Throw[False];
   ]

答案 1 :(得分:1)

我通常会使用以下内容解决此问题:

SegmentQ[l1_List, l2_List] := MemberQ[Partition[l2, Length @ l1, 1], l1]