¿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 manera de hacerlo sin usar un bucle? No pude encontrar la función adecuada.
¡Gracias por tu ayuda!
Fusión y limpieza de datosRe: ¿Cómo convertir una lista numérica en una de caracteres?@DonMcCormack El bucle for vainilla es tanto el más rápido como el más lento, según el tamaño del problema. Soy en realidad sorprendido @EM la solución basada en palabras funciona muy bien en tamaños grandes. Realmente me gustan las respuestas inesperadas que muestran una función en JMP como esa. Estoy un poco sorprendido porque cada uno es más rápido que para, en algún tamaño. Me gusta saber eso también.
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? Considere 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ía "NaN" en lugar de "."?
- ¿Cómo sería una rutina de propósito general? ¿Cómo lo llamarías si estuviera integrado en JMP?
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?Gracias @Craige_Hales ! Me gusta. Déjame ver si puedo incluirlo en el próximo desafío. ¿Deberíamos tratar de evitar cualquier iteración o simplemente Para (y sus derivados)?Una forma de evitar la iteración es a través de 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);
*/
Probé esto en algunos de los Desafíos y, aunque es breve, 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?@DonMcCormack - Desafío !
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?Buena ilustración del rendimiento dependiente del tamaño de las diferentes funciones. Todavía estoy usando JMP 15 y no puedo usar Para cada() todavía, pero para extender más el ejercicio de sincronización de Jeff, añado 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 siguió 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?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?Extendiendo la respuesta de Jeff
Different overheads hurt for small sizes and help for large sizes.Different overheads hurt for small sizes and help for large sizes.Distintos gastos generales perjudican a los tamaños pequeños y ayudan a los 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?Aquí hay un programa de tiempo rápido para los tres métodos, bucle for, for each 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?Gracias @Jeff_Perkinson !
¡Hice algunas simulaciones solo por curiosidad para comparar el tiempo de ejecución de cada solución y parece que para 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?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 por tu respuesta @txnelson es de hecho lo que estaba buscando.
Solo me pregunto qué es más rápido entre un bucle y una función que implica la creación de tablas. ¿Alguna idea?
Re: ¿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 quieres.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 );