从 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 中的第二个列表中删除包含元素的列表中的元素你好,贾莫,
感谢过滤器 each () 似乎可以解决问题,即使输入更加复杂(见下文)。
理想情况下,我需要使用以下两种方式过滤 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 () 函数:)
在 Contains 之前缺少一个“!”以使脚本能够正常工作,但现在我的 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"};