Отфильтровать подсписок в Mathematica

Я новичок в математике. Вот моя проблема:

Например, у меня есть вложенный список:

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

Я хочу вывести только те подсписки, элементы которых равны 0 или 1. Вывод приведенного выше списка должен быть:

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

Я могу получить список, который удовлетворяет моим условиям, следующим образом:

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

Но как я могу получить обратную модель? нравится:

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

Так что я могу получить результат одним махом.

Благодарность!


person jscoot    schedule 03.09.2009    source источник


Ответы (2)


Это хорошее приложение для некоторых/всех:

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).  *)

Итак, сначала создайте функцию, которая проверяет подсписок на наличие всех нулей/единиц:

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

Затем отфильтруйте свой список списков для подсписков, которые проходят тест:

Select[lst, chk]

Или, как однострочный:

Select[lst, every[#==0||#==1&, #]&]
person dreeves    schedule 03.09.2009
comment
Спасибо чувак! Судя по вашей подсказке, у меня есть другое решение: Case[lst, {(1 | 0) ..}] - person jscoot; 04.09.2009

Начиная с:

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

Вы можете фильтровать с помощью этого:

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

Или получите дополнение с помощью:

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

or:

DeleteCases[lst, {(1 | 0) ..}]
person Mr.Wizard    schedule 29.03.2011