你好
我正在尝试找到一种方法来搜索字符串列表以查找包含部分字符串的所有项目。 我知道这可以使用 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 更快。