2011-01-27 16 views
5

Tengo una lista anidada altamente irregular myList en mma, siempre que se me dé una secuencia entera, como 1,1,2,3,1 de cualquier longitud, quiero saber sien una lista anidada cómo probar si una secuencia de indexación dada es válida en mathematica

myList[[1,1,2,3,1]] 

es válido; porque si no lo es, entonces obtendré un error que dice

Part::partw: part... does not exist 

Thanks.

+2

Si bien esta es una pregunta muy legítima, es posible que desee reconsiderar el diseño de sus funciones. Si necesita comprobaciones especiales de ciertas partes, esto puede significar que el problema, o al menos su formulación actual del mismo, no se presta muy bien al enfoque basado en la indexación. Puede ser, basado en reglas o algún otro enfoque podría eliminar el problema por completo. –

Respuesta

3
Quiet[ 
     Check[mylist[[1, 1, 2, 3, 1]], Print[False], Part::partd], 
    Part::partd]; 

Puede reemplazar Imprimir [Falso] para cualquier otra acción ...

Editar

Para comprobar si hay tanto partd y partw mensajes de la sintaxis es:

Quiet[Check[{{{1, 3}}, {2}}[[1, 4, 2, 3, 1]], 
    Print[False], {Part::partd, Part::partw}], 
    {Part::partd, Part::partw}]; 

HTH!

+0

@belisarius: esto todavía no resuelve el problema que planteé en general. Vea el siguiente ejemplo simple: 'Quiet [Check [{{{1, 3}}, {2}} [[1, 1, 2, 3, 1]], Print [False], Part :: partd], Part :: partd]; ' –

+0

@Qiang Vuelva a verificar. Corre bien en mi máquina. Imprime False, como una indicación de error –

+0

@bekusarius: ¿qué pasó? Si copio/pego y lo ejecuto, su comportamiento es correcto. Pero si vuelvo a ejecutar lo que tenía originalmente, siempre tengo 'Part :: partw: Parte 4 de {{1,3}} no existe. >> '. Miré una y otra vez y encontré que las expresiones son las mismas. ¿¿¿por qué??? no hay variables definidas previamente aquí ... –

3

Coincidentemente, esto apareció en MathGroup hace unas semanas. A continuación se muestra una URL de lo que creo que fue la última y mejor respuesta (de Ray Koopman).

http://forums.wolfram.com/mathgroup/archive/2011/Jan/msg00326.html

También tiene enlaces a los mensajes anteriores en el mismo hilo.

Daniel Lichtblau

Wolfram Research

0

Aquí hay otra manera de hacerlo.

Quiet[MemberQ[#, #[[1, 4, 2, 3, 1]], Infinity] &[{{{1, 3}}, {2}}]] 

Devoluciones False.

Básicamente devolverá verdadero o falso después de verificar para ver si el elemento en esa posición (si existe) está en la lista.

Quiet[MemberQ[#, #[[1, 1, 2]], Infinity] &[{{{1, 3}}, {2}}]] 

Devoluciones True.

La respuesta de belisarius dará más control de bajo nivel.

Cuestiones relacionadas