從 JSL 中的第二個清單中刪除包含元素的清單中的元素你好,
從清單中刪除元素在 JSL 討論中有詳細記錄,但由於某種原因我無法弄清楚如何執行此操作:
如果元素包含另一個清單中的字串(不完全符合),我需要從清單中刪除元素。
下面的範例:我正在嘗試刪除包含“Cal”或“Blue”的所有元素
先謝,
- 傳教士
Names Default To Here( 1 );
clear symbols();
Deletesymbols();
ChosenDataCol = {"Cal1", "Cal2", "Cal3", "Temp1", "Temp25", "Blue56", "Blue32", "Blue95"};
RemoveCol = {"Cal", "Blue"};
For (i=1,i<=N Items( RemoveCol ), i++,
For (j=N Items (ChosenDataCol), j<=1, j--,
If(contains(ChosenDataCol[j], Eval(RemoveCol[i]))==1,
Remove from(ChosenDataCol, j)
)
)
);
show (ChosenDataCol);
基礎資料分析與建模回覆:從 JSL 中的第二個清單中刪除包含元素的清單中的元素在 For() 迴圈中,
j<=1
應該是
j>=1
Names Default To Here( 1 );
clear symbols();
Deletesymbols();
ChosenDataCol = {"Cal1", "Cal2", "Cal3", "Temp1", "Temp25", "Blue56", "Blue32", "Blue95"};
RemoveCol = {"Cal", "Blue"};
For (i=1,i<=N Items( RemoveCol ), i++,
For (j=N Items (ChosenDataCol), j>=1, j--,
If(contains(ChosenDataCol[j], RemoveCol[i])==1,
Remove from(ChosenDataCol, j)
)
)
);
show (ChosenDataCol);回覆:從 JSL 中的第二個清單中刪除包含元素的清單中的元素嗨吉姆,
哈,是的,我錯過了:)
這個解決方案有效,但似乎 contains() 不是很強大:如果要尋找的字串位於清單元素的中間,則它找不到它。
你知道為什麼嗎?
下面的腳本的日誌給出:
ChosenDataCol = {"Si Cal 1", "Ba Cal 2", "toCal 3", "Temp 1", "Temp 25", "SiBlue 32"};而不是
ChosenDataCol = {"Temp 1", "Temp 25"};
Names Default To Here( 1 );
clear symbols();
Deletesymbols();
ChosenDataCol = {"Si Cal 1", "Ba Cal 2", "toCal 3", "Temp 1", "Temp 25", "Blue 56", "SiBlue 32", "Blue 95"};
RemoveCol = {"Cal", "Blue"};
For (i=1,i<=N Items( RemoveCol ), i++,
For (j=N Items (ChosenDataCol), j>=1, j--,
If(contains(ChosenDataCol[j], Eval(RemoveCol[i]))==1,
Remove from(ChosenDataCol, j)
)
)
);
show (ChosenDataCol);謝謝
回覆:從 JSL 中的第二個清單中刪除包含元素的清單中的元素請參考我最初的回覆JSL。
Contains( ChosenDataCol[j], Eval( RemoveCol[i] ) ) == 1
被改為
contains(ChosenDataCol[j], RemoveCol[i])==1
這樣就可以得到正確的答案。我不確定為什麼 Eval() 會幹擾 Contains()
回覆:從 JSL 中的第二個清單中刪除包含元素的清單中的元素您也可以使用 For Each 或 Filter Each
Names Default To Here(1);
ChosenDataCol = {"Cal1", "Cal2", "Cal3", "Temp1", "Temp25", "Blue56", "Blue32", "Blue95"};
RemoveCol = {"Cal", "Blue"};
vals = Filter Each({val1}, ChosenDataCol,
res = Filter Each({val2}, RemoveCol,
!Contains(val1, val2)
);
N Items(res) == N Items(RemoveCol);
);
// ChosenDataCol = vals; // {"Temp1", "Temp25"}回覆:從 JSL 中的第二個清單中刪除包含元素的清單中的元素你好,賈莫,
感謝 Filter every () 似乎可以解決問題,即使輸入更複雜(見下文)。
理想情況下,我需要使用以下兩種方式過濾 ChosenDataCol 的選項:
- 根據字串清單刪除不需要的元素(這裡的方法現在有效)=>RemoveCol
- 僅保留基於字串列表的元素(與此處的方法相反)
我認為從“!Contains()”中刪除“NOT”應該可以解決問題,但它會傳回一個空列表{}。
你知道為什麼嗎?
謝謝
刪除元素 <-- 效果很好
Names Default To Here(1);
ChosenDataCol = {"SiCal 1", "Ba Cal 2", "toCal 3", "Si Temp1", "bouTemp25", "CaBlue 56", "SiBlue 32", "Blue 95"};
RemoveCol = {"Cal", "Blue"};
vals = Filter Each({val1}, ChosenDataCol,
res = Filter Each({val2}, RemoveCol,
!Contains(val1, val2)
);
N Items(res) == N Items(RemoveCol);
);
// log : {"Si Temp1", "bouTemp25"}保留元素 <-- 不起作用
Names Default To Here(1);
ChosenDataCol = {"SiCal 1", "Ba Cal 2", "toCal 3", "Si Temp1", "bouTemp25", "CaBlue 56", "SiBlue 32", "Blue 95"};
KeepCol = {"Cal", "Blue"};
vals = Filter Each({val1}, ChosenDataCol,
res = Filter Each({val2}, KeepCol,
Contains(val1, val2)
);
N Items(res) == N Items(KeepCol);
);
// log : {}
回覆:從 JSL 中的第二個清單中刪除包含元素的清單中的元素您還必須考慮 N Items(res) == N Items(KeepCol);正在做。您可以在循環內添加額外的列印來幫助解決這個問題
Names Default To Here(1);
ChosenDataCol = {"SiCal 1", "Ba Cal 2", "toCal 3", "Si Temp1", "bouTemp25", "CaBlue 56", "SiBlue 32", "Blue 95"};
KeepCol = {"Cal", "Blue"};
vals = Filter Each({val1}, ChosenDataCol,
res = Filter Each({val2}, KeepCol,
Contains(val1, val2)
);
show(res);
N Items(res) != N Items(KeepCol);
);
此外,如果您可能遇到 Cal 和 Blue 都出現在單一字串中的情況,您將需要使用稍微不同的方法
回覆:從 JSL 中的第二個清單中刪除包含元素的清單中的元素你好,賈莫,
「 show (res)」幫助我了解邏輯。我真的要多用For Each()函數:)
少了一個“!”之前包含使腳本真正起作用,但現在我的 2 個函數可以正常工作。
我將不得不考慮你最後的話,不確定這種情況是否存在!
再次感謝
牧師
Names Default To Here(1);
ChosenDataCol = {"SiCal 1", "Ba Cal 2", "toCal 3", "Si Temp1", "bouTemp25", "CaBlue 56", "SiBlue 32", "Blue 95"};
KeepCol = {"Cal", "Blue"};
vals = Filter Each({val1}, ChosenDataCol,
res = Filter Each({val2}, KeepCol,
!Contains(val1, val2)
);
N Items(res) != N Items(KeepCol);
);
show(vals)
// vals = {"SiCal 1", "Ba Cal 2", "toCal 3", "CaBlue 56", "SiBlue 32", "Blue 95"};