Eliminar un elemento de una lista que contiene elementos de una segunda lista en JSLHola,
La eliminación de elementos de una lista está bien documentada en las discusiones de JSL, pero por alguna razón no puedo entender cómo hacerlo:
Necesito eliminar elementos de una lista si los elementos CONTIENEN una cadena de otra lista (no una coincidencia exacta).
Ejemplo a continuación: Estoy intentando eliminar todos los elementos que contienen "Cal" o "Blue"
Gracias de antemano,
- Predicador
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);
Análisis y modelado de datos básicosRe: Eliminar elementos de una lista que contienen elementos de una segunda lista en JSLEn su bucle For(),
j<=1
Debería ser
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: Eliminar elementos de una lista que contienen elementos de una segunda lista en JSLHola Jim,
Jaja, sí, me lo perdí.:)
La solución funciona PERO parece que contains() no es muy robusto: si la cadena a buscar está en el medio del elemento de la lista, no la encuentra.
¿Sabes por qué?
El registro del script a continuación muestra:
ChosenDataCol = {"Si Cal 1", "Ba Cal 2", "toCal 3", "Temp 1", "Temp 25", "SiBlue 32"};en lugar de
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);Gracias
Re: Eliminar elementos de una lista que contienen elementos de una segunda lista en JSLConsulte mi respuesta inicial JSL.
Contains( ChosenDataCol[j], Eval( RemoveCol[i] ) ) == 1
Fue cambiado a
contains(ChosenDataCol[j], RemoveCol[i])==1
que permite obtener la respuesta correcta. No estoy seguro de por qué Eval() interfiere con Contains()
Re: Eliminar elementos de una lista que contienen elementos de una segunda lista en JSLTambién puedes utilizar Para cada uno o Filtrar cada
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: Eliminar elementos de una lista que contienen elementos de una segunda lista en JSLHola Jarmo,
Gracias al filtro, cada () parece funcionar, incluso con entradas más complejas (ver a continuación).
Idealmente necesito las opciones para filtrar ChosenDataCol de 2 formas:
- Eliminar elementos no deseados según la lista de cadenas (este método aquí, que funciona ahora) => RemoveCol
- Solo conserva elementos basados en la lista de cadenas (lo opuesto al método aquí)
Pensé que eliminar el "NO" de "!Contains()" debería resolver el problema, pero devuelve una lista vacía { }.
¿Sabes por qué?
gracias
Eliminar elementos <-- funciona bien
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"}Mantener elementos <-- no funciona
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: Eliminar elementos de una lista que contienen elementos de una segunda lista en JSLTambién deberás tener en cuenta lo que hace N Items(res) == N Items(KeepCol);. Puedes agregar una impresión adicional dentro del bucle para ayudarte a determinarlo.
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);
);
Además, si hay situaciones en las que tanto Cal como Blue pueden aparecer en una sola cadena, necesitarás utilizar un método un poco diferente.
Re: Eliminar elementos de una lista que contienen elementos de una segunda lista en JSLHola Jarmo,
El " show (res)" me ayudó a entender la lógica. Realmente tengo que usar más las funciones For Each():)
Faltaba un "!" antes de Contiene para que el script realmente funcionara, pero ahora mis 2 funciones funcionan correctamente.
Tendré que pensar en tu último comentario, ¡no estoy seguro de que ese escenario exista!
gracias de nuevo
Predicador
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"};