تصفية القائمة الفرعية في 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) ..}]
لا تنتمي إلى StackOverflow