こんにちは
文字列のリストから部分文字列を含むすべての項目を検索する方法を見つけようとしています。 For ループを使用してこれを実行できることはわかっていますが、このスクリプトを実行するリストは非常に大きく、For ループには非常に長い時間がかかります。 部分的な文字列を持つ項目を検索する Loc(list, string) に似た関数があるかどうか疑問に思っています。
ほんの一例として:
list= {football, hockey, baseball, tennis};
Loc(list, "ball");<BR />理想的には [1, 3] を返します。
ありがとう!
ループは良い選択かもしれないと思います。作業のほとんどはループのオーバーヘッドではなく、contains 関数内で行われます。
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 second3 つの文字列のうち 1 つに検索パターンが含まれており、結果リストのサイズはソースの 1/3 です。 150 万アイテムに対して 1 秒というのは妥当だと思われます。 サイズリスト、一般的な商品の長さ、所要時間はどれくらいですか?
別のアプローチですが、それほど良くありません。 明示的なループを回避しますが、データをテーブルにコピーし、行選択を使用します。
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 は、JMP 13 でより優れたリストのサポートを追加しました。古いバージョンを使用している場合は、この投稿をお読みください
https://community.jmp.com/t5/Uncharted/Fast-List/ba-p/28947
JMP < 13 を高速化します。