我正在编写一个程序,它给出两个列表,如果一个列表的一部分等于另一个整个列表,则返回列表的另一部分。很难解释,我将代码留在这里
E8[L_, P_] := Module[{},
final = {};
For[i = 1, i <= Length[L], i++,
ok = True;
For[j = 1, j <= Length[P], j++,
If[L[[i, j]] != P[[j]],
ok = False
]
];
If[ok == True,
coin = Take[L[[i]], {Length[P] + 1, Length[L[[i]]]}];
AppendTo[final, coin]
]
];
Return[final]
]
L = {{a, b, a}, {a, b, b}, {b, b, p}, {a, b, a, a}};
P = {a, b};
E8[L, P]
Out={{a}, {b}, {p}, {a, a}
出于某种原因,程序将 {b,b,p} 评估为 True,而不分配 ok=False。 我需要帮助。谢谢
编辑:我只需要找出为什么 ok 没有在代码的该部分分配 False
If[L[[i, j]] != P[[j]],
ok = False
]
问题肯定是存在的。我尝试将单词 {a,b} 更改为数字,并且程序运行正常,但是当我尝试比较单词时,它不起作用。我如何将列表与单词进行比较?
最佳答案
您应该使用UnsameQ
来测试两个表达式是否不相同。
UnsameQ[L[[i, j]], P[[j]]]
或简写形式
L[[i, j]] =!= P[[j]]
(这可以避免更改正在测试的表达式,如 ToString
那样。)
在更多Mathematica风格中,您的代码可以这样编写:-
e8[listL_, listP_] := Module[{plen = Length[listP]},
DeleteCases[
Map[If[SameQ[Take[#, plen], listP], Drop[#, plen]] &, listL],
Null]]
listL = {{a, b, a}, {a, b, b}, {b, b, p}, {a, b, a, a}};
listP = {a, b};
e8[listL, listP]
{{a}, {b}, {a, a}}
用户定义的变量名通常以小写字母开头,以避免与内置函数和实体冲突,例如I
、N
、C
、O
、D
、E
.
关于list - 比较 Mathematica 中的两个列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26409113/