سؤال

أنا مستخدم مبتدئ في 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) ..}]
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top