Entfernen Sie ein Element aus einer Liste, die Elemente aus einer zweiten Liste in JSL enthältHallo,
Das Entfernen von Elementen aus einer Liste ist in den JSL-Diskussionen gut dokumentiert, aber aus irgendeinem Grund kann ich nicht herausfinden, wie das geht:
Ich muss Elemente aus einer Liste entfernen, wenn die Elemente eine Zeichenfolge aus einer anderen Liste ENTHALTEN (keine exakte Übereinstimmung).
Beispiel unten: Ich versuche alle Elemente zu entfernen, die „Cal“ oder „Blue“ enthalten.
Dank im Voraus,
- Prediger
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);
Grundlegende Datenanalyse und ModellierungBetreff: Element aus einer Liste entfernen, die Elemente aus einer zweiten Liste in JSL enthältIn Ihrer For()-Schleife
j<=1
sollte sein
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);Betreff: Element aus einer Liste entfernen, die Elemente aus einer zweiten Liste in JSL enthältHallo Jim,
Ha ja, das habe ich verpasst:)
Die Lösung funktioniert, ABER es scheint, dass contains() nicht sehr robust ist: Wenn sich der zu suchende String in der Mitte des Listenelements befindet, wird er nicht gefunden.
Wissen Sie, warum?
Das Protokoll des folgenden Skripts enthält:
ChosenDataCol = {"Si Cal 1", "Ba Cal 2", "toCal 3", "Temp 1", "Temp 25", "SiBlue 32"};anstatt
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);Danke
Betreff: Element aus einer Liste entfernen, die Elemente aus einer zweiten Liste in JSL enthältBitte beachten Sie meine erste Antwort, JSL.
Contains( ChosenDataCol[j], Eval( RemoveCol[i] ) ) == 1
wurde geändert in
contains(ChosenDataCol[j], RemoveCol[i])==1
was die richtige Antwort ermöglicht. Ich bin nicht sicher, warum Eval() mit Contains() interferiert
Betreff: Element aus einer Liste entfernen, die Elemente aus einer zweiten Liste in JSL enthältSie können auch For Each oder Filter Each verwenden.
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"}Betreff: Element aus einer Liste entfernen, die Elemente aus einer zweiten Liste in JSL enthältHallo Jarmo,
Dank des Filters „each()“ scheint es auch bei komplizierteren Eingaben zu funktionieren (siehe unten).
Idealerweise brauche ich die Möglichkeit, ChosenDataCol auf zwei Arten zu filtern:
- Entfernen Sie unerwünschte Elemente basierend auf einer Zeichenfolgenliste (diese Methode hier, die jetzt funktioniert) => RemoveCol
- Behalte nur Elemente basierend auf einer Zeichenfolgenliste (das Gegenteil der Methode hier)
Ich dachte, das Entfernen von „NOT“ aus „!Contains()“ müsste funktionieren, aber es gibt eine leere Liste { } zurück.
Wissen Sie, warum?
Danke
Elemente entfernen <-- funktioniert gut
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"}Elemente behalten <-- funktioniert nicht
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 : {}
Betreff: Element aus einer Liste entfernen, die Elemente aus einer zweiten Liste in JSL enthältSie müssen auch berücksichtigen, was N Items(res) == N Items(KeepCol); tut. Sie können zusätzliches print innerhalb der Schleife hinzufügen, um dies herauszufinden.
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);
);
Auch wenn es Situationen gibt, in denen sowohl Cal als auch Blue in einer einzigen Zeichenfolge vorkommen können, müssen Sie eine etwas andere Methode verwenden
Betreff: Element aus einer Liste entfernen, die Elemente aus einer zweiten Liste in JSL enthältHallo Jarmo,
Das " show (res)" hat mir geholfen, die Logik zu verstehen. Ich muss wirklich mehr For Each ()-Funktionen verwenden:)
damit das Skript wirklich funktioniert, fehlte ein „!“ vor „Contains“, aber jetzt funktionieren meine beiden Funktionen ordnungsgemäß.
Ich muss über Ihre letzte Bemerkung nachdenken, ich bin nicht sicher, ob dieses Szenario existiert!
Danke noch einmal
Prediger
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"};