Rimuovi elemento da un elenco che contiene elementi da un secondo elenco in JSLCiao,
La rimozione di elementi da un elenco è ben documentata nelle discussioni JSL, ma per qualche motivo non riesco a capire come farlo:
Devo rimuovere elementi da un elenco se gli elementi CONTENGONO una stringa da un altro elenco (non c'è corrispondenza esatta).
Esempio qui sotto: sto cercando di rimuovere tutti gli elementi che contengono "Cal" o "Blue"
Grazie in anticipo,
- Predicatore
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);
Analisi e modellazione dei dati di baseRe: Rimuovi elemento da un elenco che contiene elementi da un secondo elenco in JSLNel tuo ciclo For(),
j<=1
dovrebbe essere
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: Rimuovi elemento da un elenco che contiene elementi da un secondo elenco in JSLCiao Jim,
Ah sì, mi è sfuggito:)
La soluzione funziona MA sembra che contains() non sia molto robusto: se la stringa da cercare si trova al centro dell'elemento dell'elenco, non la trova.
Sai perché?
Il log dello script qui sotto fornisce:
ChosenDataCol = {"Si Cal 1", "Ba Cal 2", "toCal 3", "Temp 1", "Temp 25", "SiBlue 32"};invece di
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);Grazie
Re: Rimuovi elemento da un elenco che contiene elementi da un secondo elenco in JSLSi prega di fare riferimento alla mia risposta iniziale JSL.
Contains( ChosenDataCol[j], Eval( RemoveCol[i] ) ) == 1
è stato cambiato in
contains(ChosenDataCol[j], RemoveCol[i])==1
che consente la risposta corretta. Non sono sicuro del perché Eval() interferisca con Contains()
Re: Rimuovi elemento da un elenco che contiene elementi da un secondo elenco in JSLPuoi anche utilizzare Per ogni o Filtra ogni
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: Rimuovi elemento da un elenco che contiene elementi da un secondo elenco in JSLCiao Jarmo,
Grazie al filtro each () sembra funzionare, anche con input più complessi (vedi sotto).
Idealmente avrei bisogno delle opzioni per filtrare ChosenDataCol in 2 modi:
- Rimuovi gli elementi indesiderati in base all'elenco delle stringhe (questo metodo qui, che ora funziona) => RemoveCol
- Mantieni solo gli elementi basati sull'elenco delle stringhe (l'opposto del metodo qui)
Pensavo che rimuovere "NOT" da "!Contains()" avrebbe potuto risolvere il problema, ma restituisce una lista vuota { }.
Sai perché?
Grazie
Rimuovi elementi <-- funziona bene
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"}Mantieni elementi <-- non funziona
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: Rimuovi elemento da un elenco che contiene elementi da un secondo elenco in JSLDovrai anche considerare cosa sta facendo N Items(res) == N Items(KeepCol); Puoi aggiungere una stampa extra all'interno del ciclo per aiutarti a capirlo
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);
);
Inoltre, se si verificano situazioni in cui sia Cal che Blue possono apparire in una singola stringa, sarà necessario utilizzare un metodo leggermente diverso
Re: Rimuovi elemento da un elenco che contiene elementi da un secondo elenco in JSLCiao Jarmo,
" show (res)" mi ha aiutato a capire la logica. Devo davvero usare di più le funzioni For Each():)
mancava un "!" prima di Contains per far funzionare davvero lo script, ma ora le mie 2 funzioni funzionano correttamente.
Dovrò riflettere sulla tua ultima osservazione, non sono sicuro che questo scenario esista!
grazie ancora
Predicatore
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"};