JSL で 2 番目のリストの要素を含むリストから要素を削除します。こんにちは、
リストから要素を削除する方法は 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 で 2 番目のリストの要素を含むリストから要素を削除する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 で 2 番目のリストの要素を含むリストから要素を削除するこんにちは、ジムさん
ああ、そうだ、見逃したよ:)
解決策は機能しますが、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 で 2 番目のリストの要素を含むリストから要素を削除する私の最初の回答 JSL を参照してください。
Contains( ChosenDataCol[j], Eval( RemoveCol[i] ) ) == 1
に変更されました
contains(ChosenDataCol[j], RemoveCol[i])==1
正しい答えが得られます。Eval()がContains()に干渉する理由はわかりません。
Re: JSL で 2 番目のリストの要素を含むリストから要素を削除する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 で 2 番目のリストの要素を含むリストから要素を削除するこんにちは、ジャーモさん
おかげで、Filter each () は、より複雑な入力でもうまく機能するようです (下記参照)。
理想的には、次の 2 つの方法で 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 : {}
Re: JSL で 2 番目のリストの要素を含むリストから要素を削除するまた、N Items(res) == N Items(KeepCol); が何をしているのかも考慮する必要があります。ループ内に追加の print を追加して、それを理解しやすくすることができます。
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の両方が1つの文字列に現れる可能性がある場合は、少し異なる方法を使用する必要があります。
Re: JSL で 2 番目のリストの要素を含むリストから要素を削除するこんにちは、ジャーモさん
「 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"};