2014-10-16 84 views
2

我正在做一個給定兩個列表的程序,如果一個列表的一部分與另一個列表相同,則返回列表的另一部分。很難解釋,我會離開這裏的代碼比較Mathematica中的兩個列表

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] 

時間= {{A},{B},{P},{A,A}

出於某種原因,程序評估爲True {b,b,p}並且不分配ok = False。 我需要幫助。由於

編輯:我只需要找出爲什麼確定在代碼

If[L[[i, j]] != P[[j]], 
ok = False 
] 

可以肯定的那部分的問題是有沒有分配假。我嘗試將數字{a,b}改爲數字,程序運行正常,但是當我嘗試比較單詞時,它不起作用。我怎麼能比較列表與單詞?

+0

您是否在尋找「Complement」功能?如果不是,請解釋你想要達到的目標。你幾乎肯定會用你嵌套的'For'循環來做錯誤的事情;爲什麼它看起來好像你正在使用Mathematic編寫C! – 2014-10-16 16:16:46

+0

特別不熟悉Mathematica,但我認爲,如果我正確地理解了你的意思,如果你有A和B的集合,你想在A和B的交集B中的相對補集,這簡化了A的相對補充在B. http://en.wikipedia.org/wiki/Complement_%28set_theory%29#Relative_complement – 2014-10-16 16:44:01

回答

2

您應該使用UnsameQ來測試兩個表達式是否不相同。

UnsameQ[L[[i, j]], P[[j]]] 

或簡寫形式

L[[i, j]] =!= P[[j]] 

(這避免了更換被測試的表達式,爲ToString一樣。)

數學風格你的代碼可以這樣寫: -

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

+0

感謝您的UnsameQ功能,我可以覆蓋所有的案例 – 2014-10-17 09:30:53

1

我改變了元素的字符串,它似乎工作:

If[ 
    ToString[L[[i, j]]] != ToString[P[[j]]], 
    ok = False 
    ]; 

,但你也可以只寫

ok = ToString[L[[i, j]]] != ToString[P[[j]]] 
以來的結果

=運算符是一個布爾值。

+0

不錯,這是工作。非常感謝你!! – 2014-10-16 20:36:15