【问题标题】:Checking if a a list is a segment of another list检查一个列表是否是另一个列表的一部分
【发布时间】:2012-10-08 06:49:41
【问题描述】:

我想在 Mathematica 中创建一个模块,如果第一个列表 (L1) 在第二个列表 (L2) 中,则返回 true,假设 L2 的长度大于 L1 的长度。 我是这样做的,问题是总是返回 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];   ]

【问题讨论】:

    标签: list wolfram-mathematica segment


    【解决方案1】:

    这可能是可用的最干净和最快的通用方法之一:

    isSegment[{L1__}, L2_List] := MatchQ[L2, {___, L1, ___}]
    
    isSegment[{3, 4, 5}, Range@10]
    
    True
    

    对于所有Real 或Integer 值的列表,您可以调整here 显示的方法以获得最大速度。


    用户写道:

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

    似乎Break[] 的语法和Return 的功能存在混淆。为了更正代码,我将Break 替换为Break[],将Return 替换为Throw 和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];
       ]
    

    【讨论】:

    • 谢谢,这是一个好方法,但我想要更正我的代码不要有新的,因为它是学校的练习,并且在声明中说我们必须使用 For循环。
    • @user1754322 如果这是一个专门针对 Mathematica 的练习,那是一种讽刺,因为 For 循环很少在 Mathematica 中使用。请在将来在您的问题中指定此类限制。
    • @user1754322 我已经附加了我认为是您的代码的更正版本。我没有努力检查算法。
    • 谢谢!这正是我所需要的。我很抱歉没有指定我将来会做的问题的限制。一个问题,Return[] 只用于函数还是可以在模块中使用?
    • @user1754322 很高兴能帮上忙。由于这似乎是您在 StackOverflow 上的第一个问题,所以我会提到,通过单击旁边的绿色勾号来“接受”一个完全令人满意的答案是礼貌的,而且:(1)没有义务接受一个答案 (2) 您可以随时更改或删除您的接受 (3) 它通常会产生更多或更好的答案,等待一天后再接受一个,除非您认为不可能有更好的答案。
    【解决方案2】:

    我通常会使用这样的方法来解决这个问题:

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

    【讨论】:

    • 我也喜欢这个答案。如果可以的话,我会认为它很有用:/
    猜你喜欢
    • 2021-01-04
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    相关资源
    最近更新 更多