Hola
Estoy tratando de encontrar una manera de buscar en una lista de cadenas todos los elementos que contienen una cadena parcial. Sé que esto se puede hacer usando un bucle For, pero la lista en la que ejecutaré este script es muy grande y los bucles For toman mucho tiempo. Me pregunto si existe alguna función similar a Loc (lista, cadena) que encuentre los elementos que tienen la cadena parcial.
Solo como un ejemplo:
list= {football, hockey, baseball, tennis};
Loc(list, "ball");<BR />Idealmente volvería [1, 3].
¡Gracias!
Creo que el bucle puede ser una buena opción; la mayor parte del trabajo está en la función contiene, no en la sobrecarga del ciclo.
x={"34565467456745673456345634563456abca","34563456456745674534563456346accca","34456745674556345634563456accda"};
for(i=1,i<20,i+=1,
x=x||x;
);
nitems(x); // 1572864
result={};
start=tickseconds();
for(i=1,i<=nitems(x),i+=1,
if(contains(x[i],"ccc"),insertinto(result,i))
);
stop=tickseconds();
show(nitems(x)/nitems(result),stop-start);// 3:1, <1 secondUna de las tres cadenas contiene el patrón de búsqueda, la lista de resultados es 1/3 del tamaño de la fuente. 1 segundo para 1,5 millones de elementos parece razonable. ¿Qué tamaño de lista, longitud típica de artículo y qué requisito de tiempo tiene?
Otro enfoque, no tan bueno. Evita el bucle explícito pero copia los datos en una tabla y utiliza la selección de filas:
x={"34565467456745673456345634563456abca","34563456456745674534563456346accca","34456745674556345634563456accda"};
for(i=1,i<20,i+=1,
x=x||x;
);
nitems(x); // 1572864
start=tickseconds();
dt = New Table( "Untitled",
New Column( "Column 1", Character, "Nominal", Set Values( x ) )
);
stop=tickseconds();
show(stop-start); // 1.3 sec
start=tickseconds();
dt<<SELECTWHERE></SELECTWHERE>JMP agregó un mejor soporte de lista en JMP 13; si está utilizando una versión anterior, lea esta publicación
https://community.jmp.com/t5/Uncharted/Fast-List/ba-p/28947
para hacer JMP < 13 más rápido.