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);
기본 데이터 분석 및 모델링Re: 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);Re: 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);감사해요
Re: JSL에서 두 번째 목록의 요소가 포함된 목록에서 요소 제거저의 초기 응답 JSL을 참조하세요.
Contains( ChosenDataCol[j], Eval( RemoveCol[i] ) ) == 1
로 변경되었습니다
contains(ChosenDataCol[j], RemoveCol[i])==1
올바른 답변을 허용합니다. Eval()이 Contains()를 방해하는 이유는 확실하지 않습니다.
Re: 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"}Re: JSL에서 두 번째 목록의 요소가 포함된 목록에서 요소 제거안녕하세요 Jarmo 님,
Filter each()를 사용하면 더 복잡한 입력 항목(아래 참조)에서도 문제를 해결할 수 있는 것 같습니다.
이상적으로는 ChosenDataCol을 2가지 방법으로 필터링할 수 있는 옵션이 필요합니다.
- 문자열 목록을 기반으로 원치 않는 요소를 제거합니다(이 메서드는 현재 작동합니다) => 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 : {}
Re: 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가 모두 단일 문자열로 나타날 수 있는 상황이 있는 경우 약간 다른 방법을 활용해야 합니다.
Re: JSL에서 두 번째 목록의 요소가 포함된 목록에서 요소 제거안녕하세요 Jarmo 님,
" show (res)"는 논리를 이해하는 데 도움이 되었습니다. For Each() 함수를 더 많이 사용해야 합니다.:)
스크립트를 제대로 작동시키려면 Contains 앞에 "!"가 빠졌지만, 이제 두 함수가 제대로 작동합니다.
마지막 발언에 대해 다시 생각해 보아야겠습니다. 그런 시나리오가 실제로 존재하는지 잘 모르겠네요!
다시 한번 감사드립니다
설교자
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"};