안녕하세요
부분 문자열을 포함하는 모든 항목에 대해 문자열 목록을 검색하는 방법을 찾으려고 합니다. For 루프를 사용하여 이 작업을 수행할 수 있다는 것을 알고 있지만 이 스크립트를 실행할 목록이 매우 크고 For 루프는 매우 오랜 시간이 걸립니다. 부분 문자열이 있는 항목을 찾는 Loc(list, string)과 유사한 기능이 있는지 궁금합니다.
예를 들면 다음과 같습니다.
list= {football, hockey, baseball, tennis};
Loc(list, "ball");<BR />이상적으로는 [1, 3]을 반환합니다.
감사해요!
루프가 좋은 선택일 수 있다고 생각합니다. 대부분의 작업은 루프 오버헤드가 아니라 포함 함수에 있습니다.
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입니다. 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을 더 빠르게 만들기 위해.