Come convertire un elenco numerico in uno di caratteri?Ciao a tutti,
Ho una lista contenente numeri e vorrei trasformarli in caratteri. C'è un modo per farlo senza usare un loop? Non sono riuscito a trovare la funzione corretta.
Grazie per l'aiuto!
ScriptingRi: Come convertire un elenco numerico in uno di caratteri?Ecco un piccolo script che crea una funzione che fa quello che vuoi.È possibile definire e utilizzare la funzione nel codice oppure utilizzare le 4 istruzioni nel codice aperto per eseguire la conversione.
Names Default To Here( 1 );
theList = {7,8,9};
NumListToChar = Function( {myList},
{defaultlocal},
dtx = New Table( "x", New Column( "y", values( myList ) ), private );
dtx:y << data type( character );
myList = dtx:y << get values;
Close( dtx, nosave );
Return( myList );
);
theList = NumListToChar( theList );Ri: Come convertire un elenco numerico in uno di caratteri?Grazie per la tua risposta @txnelson è davvero quello che stavo cercando.
Mi chiedo solo qual è il più veloce tra un ciclo e una funzione che coinvolge la creazione di tabelle. Qualche idea?
Ri: Come convertire un elenco numerico in uno di caratteri?Una novità di JMP 16 è Funzione For Each () che itera su un contenitore - elenco, matrice o array associativo - per eseguire un'operazione su ogni elemento.
Ecco un esempio per mostrare come usarlo per convertire il tuo elenco di numeri in un elenco di stringhe di caratteri.
Names Default To Here( 1 );
theList = {7, 8, 9};
For Each( {value, index}, theList, theList[index] = Char( value ) );
Ri: Come convertire un elenco numerico in uno di caratteri?Grazie @Jeff_Perkinson !
Ho fatto delle simulazioni solo per curiosità di confrontare i tempi di esecuzione di ogni soluzione e sembra che quella per ogni funzione sia mediamente la più veloce!
Quindi lo sceglierò anche se la funzione di @txnelson funziona anche molto bene.
Grazie a tutti e due:)
Ri: Come convertire un elenco numerico in uno di caratteri?Ecco un programma di temporizzazione veloce per i tre metodi, per loop, per ciascuno, e per la funzione personalizzata che utilizza la tabella dati.
Names Default To Here( 1 );
listsize=1000000;
theList = As List( J( listsize, 1, Random Integer( 100 ) ) );
NumListToChar = Function( {myList},
{defaultlocal},
dtx = New Table( "x", New Column( "y", values( myList ) ), private );
dtx:y << data type( character );
myList = dtx:y << get values;
Close( dtx, nosave );
Return( myList );
);
start = HP Time();
For Each( {value, index}, theList, theList[index] = Char( value ) );
foreachloop = HP Time() - start;
theList = As List( J( listsize, 1, Random Integer( 100 ) ) );
start = HP Time();
theList = NumListToChar( theList );
customfunction = HP Time() - start;
theList = As List( J( listsize, 1, Random Integer( 100 ) ) );
start = HP Time();
For( i = 1, i <= N Items( theList ), i++,
theList[i] = Char( theList[i] )
);
forloop = HP Time() - start;
show(foreachloop, customfunction, forloop);
Per me con la dimensione della lista mostrata sopra i risultati sono molto simili tra i tre metodi:
foreachloop = 1106974;
customfunction = 1077862;
forloop = 1400643;
Ri: Come convertire un elenco numerico in uno di caratteri?Estendendo la risposta di Jeff
Spese generali diverse fanno male per le taglie piccole e aiutano per le taglie grandi.
dt = New Table( "Untitled 3",
Add Rows( 0 ),
New Column( "size", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [] ) ),
New Column( "for", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [] ) ),
New Column( "foreach", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [] ) ),
New Column( "custom", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [] ) )
);
NumListToChar = Function( {myList},
{defaultlocal},
dtx = New Table( "x", New Column( "y", values( myList ) ), private );
dtx:y << data type( character );
myList = dtx:y << get values;
Close( dtx, nosave );
Return( myList );
);
For( listsize = 1, listsize < 1e7, listsize *= 2,
theList = As List( J( listsize, 1, Random Integer( 100 ) ) );
start = HP Time();
For Each( {value, index}, theList, theList[index] = Char( value ) );
foreachloop = HP Time() - start;
theList = As List( J( listsize, 1, Random Integer( 100 ) ) );
start = HP Time();
theList = NumListToChar( theList );
customfunction = HP Time() - start;
theList = As List( J( listsize, 1, Random Integer( 100 ) ) );
start = HP Time();
For( i = 1, i <= N Items( theList ), i++,
theList[i] = Char( theList[i] )
);
forloop = HP Time() - start;
Show( foreachloop, customfunction, forloop );
dt << addrows( 1 );
dt:size[N Rows( dt )] = listsize;
dt:for[N Rows( dt )] = forloop / 1e6;
dt:foreach[N Rows( dt )] = foreachloop / 1e6;
dt:custom[N Rows( dt )] = customfunction / 1e6;
Wait( 0.1 ); // so it shows on display
);Ri: Come convertire un elenco numerico in uno di caratteri?Grazie per le informazioni aggiuntive @Jeff_Perkinson e @Craige_Hales !
Impariamo sempre molte cose con la Community !!
Ri: Come convertire un elenco numerico in uno di caratteri?Bella illustrazione delle prestazioni dipendenti dalle dimensioni delle diverse funzioni. Sto ancora usando JMP 15 e non posso usare Per ciascuno() tuttavia, ma per estendere ulteriormente l'esercizio di tempistica di Jeff, aggiungo altre due funzioni che danno lo stesso risultato.
Repeat(k = 0; {k++; Char( theList[k] )}, listsize);
Words( Substr( Char( theList ), 2, Length( Char( thelist ) ) - 2 ), ", " );

Il ciclo For, che è il più veloce per gli elenchi piccoli, è superato da Words a dimensione> 50, dalla funzione data-table-deviazione a size> 1000 e da Repeat a size> 30000.
Sono stato un po 'sorpreso di vedere che Words è rimasto il più veloce per la dimensione> 50, circa il doppio più veloce con milioni di "parole".
Ri: Come convertire un elenco numerico in uno di caratteri?Wow, stavo cercando una soluzione e ne ho avute così tante! JMP è fantastico! Grazie a tutti voi!
Ri: Come convertire un elenco numerico in uno di caratteri?@DonMcCormack - Sfida !
Ri: Come convertire un elenco numerico in uno di caratteri?Grazie @Craige_Hales ! Mi piace. Fammi vedere se riesco a farcela nella prossima sfida. Dovremmo cercare di evitare qualsiasi iterazione o semplicemente Per (e suoi derivati)?Un modo per evitare l'iterazione è attraverso la valutazione dell'espressione. Se non hai familiarità con questo approccio, dai un'occhiata @Joseph Morgan 'S Tutorial sulla scoperta, punto 1 . Per il problema precedente, la funzione potrebbe essere simile a questa:
convertNumberToCharacter = Function({inList},{i=1,outList={}},
outList[1::N Items(inList)] = Expr(Char(inList[i++]));
Eval List(outList);
);
/* You can check it out using the code below.
tStart = HP Time();
alist = As List(J(10000,1,Random Normal(1e6,1e5)));
newList = convertNumberToCharacter(alist);
Print((HP Time()-tStart)/1e6);
*/
L'ho provato in alcune delle sfide e, sebbene succinto, tende a richiedere più tempo ed è più difficile da capire (a meno che tu non abbia abbastanza familiarità con la gestione delle espressioni).
Ri: Come convertire un elenco numerico in uno di caratteri?C'è anche Transform Each, che sembra essere un po 'più veloce di For Each qui.
theList = Transform Each( {value}, theList, Char( value ) );
Ri: Come convertire un elenco numerico in uno di caratteri?@DonMcCormack Il vanilla for-loop è sia più veloce che più lento, a seconda della dimensione del problema. sono veramente sorpreso @SM la soluzione basata sulle parole funziona così bene a grandi dimensioni. Mi piacciono molto le risposte inaspettate che mostrano una funzionalità di JMP come quella. Sono un po 'sorpreso per: ognuno è più veloce di, con una certa dimensione. Mi piace saperlo anche io.
Non cercherò di evitare nulla. Mi piace il tuo attuale piano per una discussione, piuttosto che un chiaro vincitore. Ecco alcune idee per iniziare la discussione:
- Se avessi N elenchi da convertire e tutti avessero M elementi, in che modo N e M influenzano il codice che scriveresti? Considera non solo la velocità, ma la correttezza e la facilità di manutenzione.
- Quali idee sembrano migliori per le macchine con limitazioni di memoria?
- Come mostreresti "NaN" invece di "."?
- Come sarebbe una routine per scopi generali? Come lo chiameresti se fosse integrato in JMP?