¿Cómo convertir una lista numérica en una de caracteres?Hola a todos,
Tengo una lista que contiene números y me gustaría transformarlos en caracteres. ¿Hay alguna forma de hacerlo sin usar un bucle? No pude encontrar la función adecuada.
¡Gracias por tu ayuda!
ScriptingRe: ¿Cómo convertir una lista numérica en una de caracteres?Aquí hay un pequeño script que crea una función que hace lo que quiere.Puede definir y usar la función en su código, o usar las 4 declaraciones en código abierto para hacer la conversión.
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 );Re: ¿Cómo convertir una lista numérica en una de caracteres?Gracias por tu respuesta @txnelson de hecho es lo que estaba buscando.
Me pregunto qué es más rápido entre un bucle y una función que implica la creación de una tabla. ¿Alguna idea?
Re: ¿Cómo convertir una lista numérica en una de caracteres?Nuevo en JMP 16 es el Para cada función () que itera sobre un contenedor (lista, matriz o matriz asociativa) para realizar una operación en cada elemento.
Aquí hay un ejemplo para mostrar cómo usarlo para convertir su lista de números en una lista de cadenas de caracteres.
Names Default To Here( 1 );
theList = {7, 8, 9};
For Each( {value, index}, theList, theList[index] = Char( value ) );
Re: ¿Cómo convertir una lista numérica en una de caracteres?Gracias @Jeff_Perkinson !
¡Hice algunas simulaciones solo por curiosidad para comparar el tiempo de ejecución de cada solución y parece que el de cada función es en promedio la más rápida!
Así que voy a elegir ese aunque la función de @txnelson también funciona muy bien.
Gracias a los dos:)
Re: ¿Cómo convertir una lista numérica en una de caracteres?Aquí hay un programa de cronometraje rápido para los tres métodos, bucle for, para cada uno, y función personalizada usando la tabla de datos.
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);
Para mí, con el tamaño de lista que se muestra arriba, los resultados son muy similares entre los tres métodos:
foreachloop = 1106974;
customfunction = 1077862;
forloop = 1400643;
Re: ¿Cómo convertir una lista numérica en una de caracteres?Extendiendo la respuesta de Jeff
Diferentes gastos generales duelen para tamaños pequeños y ayudan para tamaños grandes.
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
);Re: ¿Cómo convertir una lista numérica en una de caracteres?Gracias por la informacion adicional @Jeff_Perkinson y @Craige_Hales !
¡¡Siempre aprendemos muchas cosas con la Comunidad !!
Re: ¿Cómo convertir una lista numérica en una de caracteres?Bonita ilustración del rendimiento dependiente del tamaño de las diferentes funciones. Sigo usando JMP 15 y no puedo usar Para cada() sin embargo, pero para extender aún más el ejercicio de cronometraje de Jeff, agrego dos funciones más que dan el mismo resultado.
Repeat(k = 0; {k++; Char( theList[k] )}, listsize);
Words( Substr( Char( theList ), 2, Length( Char( thelist ) ) - 2 ), ", " );

El bucle For, que es el más rápido para listas pequeñas, es superado por Words en tamaño> 50, por la función data-table-detour en tamaño> 1000 y por Repeat en tamaño> 30000.
Me sorprendió un poco ver que Words seguía siendo el más rápido para el tamaño> 50, aproximadamente el doble de rápido en millones de "palabras".
Re: ¿Cómo convertir una lista numérica en una de caracteres?¡Guau, estaba buscando una solución y obtuve tantas! ¡JMP es increíble! ¡Gracias a todos!
Re: ¿Cómo convertir una lista numérica en una de caracteres?@DonMcCormack - Desafío !
Re: ¿Cómo convertir una lista numérica en una de caracteres?Gracias @Craige_Hales ! Me gusta. Déjame ver si puedo incorporarlo al próximo desafío. ¿Deberíamos intentar evitar cualquier iteración o simplemente Para (y sus derivados)?Una forma de evitar la iteración es mediante la evaluación de expresiones. Si no está familiarizado con este enfoque, consulte @Joseph Morgan 's Tutorial de descubrimiento, punto 1 . Para el problema anterior, la función podría verse así:
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);
*/
He intentado esto en algunos de los desafíos y, aunque es sucinto, tiende a tomar más tiempo y es más difícil de entender (a menos que esté bastante familiarizado con el manejo de expresiones).
Re: ¿Cómo convertir una lista numérica en una de caracteres?También está Transform Each, que parece ser un poco más rápido que For Each aquí.
theList = Transform Each( {value}, theList, Char( value ) );
Re: ¿Cómo convertir una lista numérica en una de caracteres?@DonMcCormack El bucle de vainilla es a la vez más rápido y más lento, según el tamaño del problema. soy De Verdad sorprendido @Sra la solución basada en palabras funciona muy bien en tamaños grandes. Realmente me gustan las respuestas inesperadas que muestran una característica en JMP como esa. Estoy un poco sorprendido porque cada uno es más rápido que para, en cierto tamaño. También me gusta saber eso.
No intentaría evitar nada. Me gusta su plan actual para una discusión, en lugar de un claro ganador. Aquí hay algunas ideas para iniciar la discusión:
- Si tuviera N listas para convertir, y todas tuvieran M elementos, ¿cómo afectan N y M al código que escribiría? Tenga en cuenta no solo la velocidad, sino también la corrección y la facilidad de mantenimiento.
- ¿Qué ideas parecen mejores para las máquinas con limitaciones de memoria?
- ¿Cómo mostrarías "NaN" en lugar de "."?
- ¿Cómo sería una rutina de propósito general? ¿Cómo lo llamaría si estuviera integrado en JMP?