Hallo
Ich versuche, eine Möglichkeit zu finden, eine Liste von Zeichenfolgen nach allen Elementen zu durchsuchen, die eine Teilzeichenfolge enthalten. Ich weiß, dass dies mit einer For-Schleife möglich ist, aber die Liste, auf der ich dieses Skript ausführen werde, ist sehr umfangreich und For-Schleifen dauern sehr lange. Ich frage mich, ob es eine ähnliche Funktion wie Loc(list, string) gibt, die die Elemente findet, die die Teilzeichenfolge enthalten.
Nur als Beispiel:
list= {football, hockey, baseball, tennis};
Loc(list, "ball");<BR />Würde idealerweise [1, 3] zurückgeben.
Danke!
Ich denke, die Schleife könnte eine gute Wahl sein; Der größte Teil der Arbeit liegt in der Funktion „enthält“, nicht im Schleifenaufwand.
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 secondEiner der drei Strings enthält das Suchmuster, die Ergebnisliste ist 1/3 der Größe der Quelle. 1 Sekunde für 1,5 Millionen Artikel scheint angemessen. Welche Größenliste, typische Artikellänge und welchen Zeitbedarf haben Sie?
Ein anderer Ansatz, nicht so gut. Vermeidet die explizite Schleife, kopiert aber die Daten in eine Tabelle und verwendet die Zeilenauswahl:
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 hat in JMP 13 eine bessere Listenunterstützung hinzugefügt; Wenn Sie eine ältere Version verwenden, lesen Sie diesen Beitrag
https://community.jmp.com/t5/Uncharted/Fast-List/ba-p/28947
um JMP < 13 schneller zu machen.