2011-01-27 18 views
5

Ho un elenco nidificato altamente irregolare myList in mma, ogni volta che mi viene assegnata una sequenza intera, ad esempio 1,1,2,3,1 di qualsiasi lunghezza, voglio sapere sein un elenco annidato come verificare se una determinata sequenza di indicizzazione è valida in matematica

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

valido; perché se non lo è, allora riceverò un errore dicendo

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

Grazie.

+2

Mentre questa è una domanda molto legittima, è comunque possibile riconsiderare il design delle proprie funzioni. Se hai bisogno di controlli speciali che certe parti esistono, questo potrebbe significare che il problema, o almeno la tua attuale formulazione, non si presta bene all'approccio basato sull'indicizzazione. Può essere, basato su regole o qualche altro approccio potrebbe eliminare del tutto il problema. –

risposta

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

È possibile sostituire Stampa [false] per qualsiasi altra azione ...

Modifica

Per verificare la presenza di entrambi partd e partw messaggi La sintassi è:

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

HTH!

+0

@belisarius: questo ancora non risolve il problema che ho posto in generale. Guarda il seguente semplice esempio: 'Quiet [Controlla [{{{1, 3}}, {2}} [[1, 1, 2, 3, 1]], Stampa [Falso], Part :: partd], Part :: partd]; ' –

+0

@Qiang Si prega di ricontrollare. Funziona bene nella mia macchina. Stampa False, come indicazione di errore –

+0

@bekusarius: cosa è successo? Se copio/incollo ed eseguo, il suo comportamento è corretto. Ma se rieseguo ciò che avevo originariamente, ho capito che 'Part :: partw: Part 4 of {{1,3}} non esiste. >> '. Ho guardato ancora e ancora e ho trovato che le espressioni erano le stesse. perché??? nessuna variabile precedentemente definita qui ... –

0

Ecco un altro modo di farlo.

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

Restituisce Falso.

In pratica restituirà true o false dopo aver verificato se l'elemento in quella posizione (se presente) è presente nell'elenco.

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

Restituisce vero.

La risposta di belisarius darà però un controllo più basso.

Problemi correlati