سؤال

تحدد مكتبة بيثون القياسية any() وظيفة ذلك

عودة TRUE إذا كان أي عنصر من عنصر قابلة للتكرار صحيح. إذا كان التكرار فارغا، فارجع خطأ.

إنه يتحقق فقط إذا كانت العناصر تقيم ل True. وبعد ما أريده أن تكون قادرا حتى يحدد رد اتصال معرفة ما إذا كان عنصر يناسب مشروع القانون مثل:

any([1, 2, 'joe'], lambda e: isinstance(e, int) and e > 0)
هل كانت مفيدة؟

المحلول

ماذا عن:

>>> any(isinstance(e, int) and e > 0 for e in [1,2,'joe'])
True

كما يعمل مع all() بالطبع بكل تأكيد:

>>> all(isinstance(e, int) and e > 0 for e in [1,2,'joe'])
False

نصائح أخرى

أي تعرض الدالة صحيحا عندما يكون أي شرط صحيح.

>>> any(isinstance(e, int) and e > 0 for e in [0 ,0, 1])
True # Returns True because 1 is greater than 0.


>>> any(isinstance(e, int) and e > 0 for e in [0 ,0, 0])
False # Returns False because not a single condition is True.

في الواقع، مفهوم أي يتم إحضار الوظيفة من LISP أو يمكنك أن تقول من نهج برمجة الوظائف. هناك وظيفة أخرى تعكسها فقط الكل

>>> all(isinstance(e, int) and e > 0 for e in [1, 33, 22])
True # Returns True when all the condition satisfies.

>>> all(isinstance(e, int) and e > 0 for e in [1, 0, 1])
False # Returns False when a single condition fails.

هاتان الوظيفتان باردان حقا عند استخدامه بشكل صحيح.

يجب عليك استخدام "تعبير المولدات" - أي بناء لغة يمكن أن تستهلك المحامي وتطبيق المرشح والتعبيرات عند سطر واحد:

علي سبيل المثال (i ** 2 for i in xrange(10)) هو مولد لساحة أول 10 أرقام طبيعية (من 0 إلى 9)

كما أنها تسمح بفقرة "إذا" لتصفية ITENS على جملة "for"، لذلك على سبيل المثال، يمكنك استخدامها:

any (e for e in [1, 2, 'joe'] if isinstance(e, int) and e > 0)

تحسين طفيف لإجابة أنطوان P

>>> any(type(e) is int for e in [1,2,'joe'])
True

بالنسبة all()

>>> all(type(e) is int for e in [1,2,'joe'])
False

بينما أعطى الآخرون إجابات بيثونية جيدة (أود فقط استخدام الإجابة المقبولة في معظم الحالات)، أردت فقط أن أشير إلى ما مدى سهولة إجراء وظيفة المرافق الخاصة بك للقيام بذلك بنفسك إذا كنت تفضل ذلك حقا:

def any_lambda(iterable, function):
  return any(function(i) for i in iterable)

In [1]: any_lambda([1, 2, 'joe'], lambda e: isinstance(e, int) and e > 0
Out[1]: True
In [2]: any_lambda([-1, '2', 'joe'], lambda e: isinstance(e, int) and e > 0)
Out[2]: False

أعتقد أنني سأحددها على الأقل مع المعلمة الوظيفة أولا، لأنه نظرا لأن ذلك يجب أن تطابق بشكل أوثق الوظائف المدمجة الحالية مثل الخريطة () والمرشح ():

def any_lambda(function, iterable):
  return any(function(i) for i in iterable)

فلتر يمكن أن يعمل، بالإضافة إلى أنه يعيدك عناصر مطابقة

>>> filter(lambda e: isinstance(e, int) and e > 0, [1,2,'joe'])
[1, 2]

يمكنك استخدام مزيج من any و map إذا كنت تريد حقا الحفاظ على تدوين Lambda الخاص بك مثل ذلك:

any(map(lambda e: isinstance(e, int) and e > 0, [1, 2, 'joe']))

ولكن من الأفضل استخدام تعبير مولد لأنه لن يبني القائمة بأكملها مرتين.

اذا أنت حقا تريد مضمنة Lambda في أي () يمكنك القيام بذلك:

>>> any((lambda: isinstance(e, int))() for e in [1,2,'joe'])
True
>>> any((lambda: isinstance(e, int))() for e in ['joe'])
False

عليك فقط أن تختتم Lambda Unnamed وضمان احتجازه في كل تمريرة من خلال إلحاق ()

ميزة هنا هي أنك لا تزال تحصل على الاستفادة من دارة قصيرة تقييم أي عندما تضغط على الأول

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top