Bonjour
J'essaie de trouver un moyen de rechercher dans une liste de chaînes tous les éléments contenant une chaîne partielle. Je sais que cela peut être fait en utilisant une boucle For, mais la liste sur laquelle je vais exécuter ce script est très longue et les boucles For prennent très longtemps. Je me demande s'il existe une fonction similaire à Loc(list, string) qui trouvera les éléments qui ont la chaîne partielle.
Juste à titre d'exemple :
list= {football, hockey, baseball, tennis};
Loc(list, "ball");<BR />Je reviendrais idéalement [1, 3].
Merci!
Je pense que la boucle peut être un bon choix ; la majeure partie du travail se trouve dans la fonction contains, pas dans la surcharge de la boucle.
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 secondL'une des trois chaînes contient le modèle de recherche, la liste des résultats correspond à 1/3 de la taille de la source. 1 seconde pour 1,5 million d'articles semble raisonnable. Quelle liste de tailles, longueur d'article typique et quel délai avez-vous ?
Une autre approche, moins bonne. Évite la boucle explicite mais copie les données dans une table et utilise la sélection de lignes :
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 a ajouté une meilleure prise en charge des listes dans JMP 13 ; si vous utilisez une ancienne version, lisez ce post
https://community.jmp.com/t5/Uncharted/Fast-List/ba-p/28947
pour rendre JMP < 13 plus rapide.