Отфильтровать подсписок в Mathematica
-
21-09-2019 - |
Вопрос
Я новичок в 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[]
Так что я могу получить результат одним махом.
Спасибо!
Решение
Это хорошее приложение для некоторых / каждого:
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&, #]&]
Другие советы
Начиная с:
lst = {{1, 0, 0}, {0, 1, 1}, {2, 0, 1}, {1}, {0, 3}};
Вы можете фильтровать с помощью этого:
Cases[lst, {(1 | 0) ..}]
Или получите дополнение с помощью любого из:
Cases[lst, Except @ {(1 | 0) ..} ]
или:
DeleteCases[lst, {(1 | 0) ..}]