Domanda

Sono un utente novizio in matematica. Ecco il mio problema:

Per esempio, ho una lista annidata:

 lst = {{1, 0, 0}, {0, 1, 1}, {2, 0, 1}, {1}, {0,3}}

Voglio solo uscita coloro elenco secondario i cui elementi sono 0 o 1. L'uscita di sopra della lista dovrebbe essere:

{{1, 0, 0}, {0, 1, 1}, {1}}

posso ottenere la lista che soddisfa le mie condizioni con questo:

lst /. x:{(1 | 0) ..} :> x

Ma come posso ottenere il contrario del modello? in questo modo:

 lst /. x:NOT{(1 | 0) ..} :> Sequence[]

In modo che io possa ottenere il risultato in un colpo solo.

grazie!

È stato utile?

Soluzione

Questa è una simpatica applicazione per alcuni / tutti:

some[f_, l_List] :=                          (* whether f applied to some     *)
  Scan[If[f[#], Return[True]]&, l] === True  (*  element of list is True.     *)

every[f_, l_List] :=                         (* similarly, And @@ f/@l        *)
  Scan[If[!f[#], Return[False]]&, l]===Null  (*  (but with lazy evaluation).  *)

Quindi, prima fare una funzione che controlla un elenco secondario per tutti zeri / quelli:

chk[lst_] := every[#==0||#==1&, lst]

Poi filtrare l'elenco-of-liste per sottoliste che passano il test:

Select[lst, chk]

In alternativa, come un one-liner:

Select[lst, every[#==0||#==1&, #]&]

Altri suggerimenti

A partire da:

lst = {{1, 0, 0}, {0, 1, 1}, {2, 0, 1}, {1}, {0, 3}};

È possibile filtrare con questo:

Cases[lst, {(1 | 0) ..}]

O ottenere il complemento sia con:

Cases[lst, Except @ {(1 | 0) ..} ]

o

DeleteCases[lst, {(1 | 0) ..}]
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top