你好
我正在嘗試找到一種方法來搜索字符串列表以查找包含部分字符串的所有項目。 我知道這可以使用 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 second三個字符串之一包含搜索模式,結果列表是源大小的 1/3。 1 秒處理 150 萬個項目似乎是合理的。 您有什麼尺寸清單、典型的商品長度以及時間要求?
另一種方法,不太好。 避免顯式循環,但將數據複製到表中並使用行選擇:
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 更快。