Ciao
Sto cercando di trovare un modo per cercare in un elenco di stringhe tutti gli elementi che contengono una stringa parziale. So che questo può essere fatto usando un ciclo For, ma l'elenco su cui eseguirò questo script è molto grande e i cicli For richiedono molto tempo. Mi chiedo se esiste una funzione simile a Loc(list, string) che troverà gli elementi che hanno la stringa parziale.
Solo come esempio:
list= {football, hockey, baseball, tennis};
Loc(list, "ball");<BR />Ritornerebbe idealmente [1, 3].
Grazie!
Penso che il loop possa essere una buona scelta; la maggior parte del lavoro è nella funzione contains, non nell'overhead 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 delle tre stringhe contiene il modello di ricerca, l'elenco dei risultati è 1/3 della dimensione della fonte. 1 secondo per 1,5 milioni di articoli sembra ragionevole. Quale elenco di dimensioni, lunghezza tipica dell'articolo e quali requisiti di tempo hai?
Un altro approccio, non così buono. Evita il ciclo esplicito ma copia i dati in una tabella e utilizza la selezione delle righe:
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 ha aggiunto un migliore supporto per gli elenchi in JMP 13; se stai usando una versione precedente, leggi questo post
https://community.jmp.com/t5/Uncharted/Fast-List/ba-p/28947
per rendere JMP < 13 più veloce.