Concatena più elementi dell'elenco insiemeUtilizzo di JMP12.2 - Sto cercando un modo veloce per concatenare gli elementi dell'elenco insieme da due elenchi diversi in modo 1 a 1, supponendo che gli elenchi abbiano lo stesso numero di elementi. Questo verrà utilizzato per ogni riga in tabelle molto grandi, quindi preferisco nessuna funzione iterativa, se possibile.
Ecco un esempio di ciò che voglio ottenere:
lista1 = {"a","b","c","d","e","f","g"};
lista2 = {"1","2","3","4","5","6","7"};
Il risultato accettabile può essere una stringa o un elenco. Se stringa separata da delimitatori.
Risultato della lista: {"a,1","b,2","c,3","d,4","e,5","f,6","g,7"};
Risultato della stringa: "a:1,b:2,c:3,d:4,e:5,f:6,g:7";
ScriptingRe: Concatenare più elementi dell'elenco insiemeCiao @ts2 ,
A seconda di cosa vuoi fare con i risultati, potresti approcciarlo in un paio di modi diversi. So che non vuoi eseguire funzioni iterative, ma per ottenere il giusto output in cui gli elementi di un elenco sono collegati agli elementi di un altro elenco, penso che devi fare un ciclo For. Potresti anche considerare di creare un array associativo.
Di seguito sono riportati alcuni JSL che potrebbero aiutarti a iniziare una soluzione.
names default to here(1);
list1 = {"a","b","c","d","e","f","g"};
list2 = {"1","2","3","4","5","6","7"};
AA = Associative Array(List1, List2);
i=.;
result1={};
For(i=1, i<=nitems(list1), i++,
result1[i]=list1[i]||":"||list2[i]
);
result 2 = EvalList({Concat Items(result1, ", ")});
Show(result1);
Show(result2);
Show (AA);Spero questo sia di aiuto!,
DS
Re: Concatenare più elementi dell'elenco insiemeI loop JSL hanno una cattiva reputazione immeritatamente. Se le viscere del loop fanno molto lavoro, l'overhead del loop di solito non importa molto. E qualsiasi soluzione senza un ciclo JSL coinvolgerà un ciclo da qualche altra parte, forse in C++ che sarà un po' più veloce, ma comunque. Ad ogni modo, ecco un confronto tra due metodi, uno che coinvolge un ciclo JSL e uno che utilizza un ciclo nascosto nel codice C++ di JMP.
Grafico che mostra i tempi di crossover dei due algoritmi a circa 39.000 elementi.
dtGraph = New Table( "stats",
Add Rows( 0 ),
New Column( "size", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [] ) ),
New Column( "table time", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [] ) ),
New Column( "loop time", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [] ) )
);
For( n = 1, n < 1e7, n *= 2,
dtGraph << addrows( 1 );
dtGraph:size[N Rows( dtGraph )] = n * 3;// 3 items repeated...
list1 = Repeat( {"a", "b", "c"}, n );
list2 = Repeat( {"1", "2", "3"}, n );
start = HP Time(); // data table method begins here
dt = New Table( "temp",
New Column( "a", Character, "Nominal", Set Values( list1 ) ),
New Column( "b", Character, "Nominal", Set Values( list2 ) ),
New Column( "c", Character, "Nominal", formula( a || ":" || b ) ),
invisible
);
dt << runformulas;
result = dt:c << getvalues;
Close( dt, nosave );
stop = HP Time(); // data table method ends here
Show( stop - start );
result = Concat Items( result, "," );
Show( Length( result ), Left( result, 100 ) );
dtGraph:table time[N Rows( dtGraph )] = (stop - start) / 1e6;
result = {};
start = HP Time(); // loop method begins here
While(
a = Remove From( list1, 1 );
b = Remove From( list2, 1 );
N Items( a ); // as long as something was removed...
, // do this...
Insert Into( result, a[1] || ":" || b[1] )
);
stop = HP Time(); // loop method ends here
Show( stop - start );
result = Concat Items( result, "," );
Show( Length( result ), Left( result, 100 ) );
dtGraph:loop time[N Rows( dtGraph )] = (stop - start) / 1e6;
Wait( 1 );
);
dtGraph << Graph Builder(
Size( 1200, 500 ),
Show Control Panel( 0 ),
Variables( X( :size ), Y( :table time ), Y( :loop time, Position( 1 ) ) ),
Elements( Points( X, Y( 1 ), Y( 2 ), Legend( 5 ) ), Smoother( X, Y( 1 ), Y( 2 ), Legend( 6 ) ) ),
SendToReport(
Dispatch( {}, "size", ScaleBox, {Scale( "Log" ), Inc( 1 ), Minor Ticks( 1 )} ),
Dispatch( {}, "table time", ScaleBox, {Scale( "Log" ), Format( "Best", 12 ), Inc( 1 ), Minor Ticks( 1 )} )
)
);JMP 14 è il più vecchio a cui ho accesso. Penso che l'algoritmo del ciclo avrà prestazioni simili in JMP 12. Distrugge intenzionalmente i due elenchi mentre li elabora perché le versioni precedenti di JMP non avevano un'indicizzazione rapida negli elenchi, ma la rimozione del primo elemento è veloce. L'algoritmo della tabella dati è il primo nel ciclo, quindi può utilizzare gli elenchi prima che vengano distrutti.
Guardando indietro al JSL, non dovrei affermare che nessuno dei due algoritmi sia più semplice o più facile da seguire.
Re: Concatenare più elementi dell'elenco insiemeSì, potrei aver supposto che l'iterativo (per) all'interno dell'iterativo (per ogni riga) avrebbe avuto un impatto grave sulle prestazioni dello script, ma dopo aver creato l'esempio @DiedrichSchmidt suggerito che la performance è sorprendentemente buona.
Grazie per il confronto: avrei pensato che il c++ sarebbe sempre stato più veloce, ma ha senso che una tabella abbia sempre più sovraccarico. Mi chiedo se la tabella "Inizia aggiornamento dati" e/o "Privato" migliorerà il sovraccarico della tabella?
Re: Concatenare più elementi dell'elenco insiemeGrazie questo funziona alla grande. Anche se utilizza una funzione iterativa, ha buone prestazioni.
Re: Concatenare più elementi dell'elenco insiemeIl mio problema è risolto - questo è più un FYI per te e per altri che potrebbero trovarlo utile.
Ho accesso a JMP14.3 ma lo script deve essere eseguito su JMP12.2 per compatibilità all'interno della mia organizzazione.
Ho provato la tua analisi e per JMP14.3 ho ottenuto risultati simili ai tuoi, probabilmente alcune differenze nella potenza di calcolo.

Tuttavia, JMP12.2 le prestazioni del ciclo vanno completamente fuori linea. Devo uccidere il processo JMP.exe dopo 98304 poiché il tempo stava aumentando in modo esponenziale e non avrebbe mai raggiunto la 24a riga:
