एक अजगर सूची में सभी तत्वों के लिए एक तार्किक ऑपरेटर कैसे लागू करें


89

मेरे पास अजगर में बुलियन की एक सूची है। मैं उन्हें (या या नहीं) और उन्हें परिणाम प्राप्त करना चाहता हूं। निम्नलिखित कोड काम करता है, लेकिन बहुत ही अजगर नहीं है।

def apply_and(alist):
 if len(alist) > 1:
     return alist[0] and apply_and(alist[1:])
 else:
     return alist[0]

कैसे इसे और अधिक pythonic की सराहना करने के लिए पर कोई सुझाव।

जवाबों:


175

andसभी तत्वों में तार्किक a_list:

all(a_list)

orसभी तत्वों में तार्किक a_list:

any(a_list)

यदि आप रचनात्मक महसूस करते हैं, तो आप यह भी कर सकते हैं:

import operator
def my_all(a_list):
  return reduce(operator.and_, a_list, True)

def my_any(a_list):
  return reduce(operator.or_, a_list, False)

ध्यान रखें कि शॉर्ट-सर्किट में उन का मूल्यांकन नहीं किया जाता है, जबकि अंतर्निहित- ;-)

एक और मजेदार तरीका:

def my_all_v2(a_list):
  return len(filter(None,a_list)) == len(a_list)

def my_any_v2(a_list):
  return len(filter(None,a_list)) > 0

और अभी तक एक और:

def my_all_v3(a_list):
  for i in a_list:
    if not i:
      return False
  return True

def my_any_v3(a_list):
  for i in a_list:
    if i:
      return True
  return False

और हम पूरे दिन जा सकते हैं, लेकिन हाँ, pythonic तरीका इस्तेमाल करना है allऔर any:-)

वैसे, पायथन ने पुनरावृत्ति उन्मूलन नहीं किया है, इसलिए LISP कोड का अनुवाद करने की कोशिश न करें;


8
oper.and_ बिटवाइज़ और ऑपरेटर है, तार्किक और नहीं।
— चींटियों का प्लाज्मा

1
सौभाग्य से सच और गलत (ऑप वांट के रूप में) क्रमशः 1 और 0 के लिए डाले गए हैं, इसलिए बिटवाइज़ ऑपरेटर तार्किक ^ _ ^ के रूप में काम करते हैं
— फोरट्रान

6
बहुत से अनावश्यक संस्करण समझाया, लेकिन वास्तविक सही उत्तर के लिए वाक्यविन्यास प्रदान नहीं किया।
— jwg

2
आप जो चाहते हैं, उससे असहमत हों: यह faq में है: stackoverflow.com/privileges/vote-down
— फोरट्रान

2
ध्यान दें कि reduce()में है functoolsअजगर 3.0 के बाद से
— डंकन WP

33

एंडिंग और ओर्डिंग आसान है:

>>> some_list = [True] * 100
# OR
>>> any(some_list)
True
#AND
>>> all(some_list)
True
>>> some_list[0] = False
>>> any(some_list)
True
>>> all(some_list)
False

नोट करना भी काफी आसान है:

>>> [not x for x in some_list]
[True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False]

बेशक, आप उन परिणामों का उपयोग कैसे करेंगे, इसके लिए DeMorgan के प्रमेय के कुछ दिलचस्प अनुप्रयोगों की आवश्यकता हो सकती है।


4
यदि आप वैरिएंट का शॉर्ट-सर्कुलेशन चाहते हैं, तो बस जेनरेटर एक्सप्रेशंस का उपयोग करें: all(not x for x in some_list)(लेकिन यह वही है not any(some_list)(काफी प्राकृतिक अभिव्यक्ति, हुह?))।
— u0b34a0f6ae

16

इसे कम कर सकते हैं:

reduce(lambda a,b: a and b, alist, True)

जैसा कि फोरट्रान ने उल्लेख किया है, सभी इसे करने का सबसे सक्सेस तरीका है। लेकिन अधिक सामान्य प्रश्न के उत्तर को कम करें "अजगर सूची में सभी तत्वों के लिए एक तार्किक ऑपरेटर कैसे लागू करें?"


4
कम दूर नहीं जा रहा है, AFAIK। यह वैश्विक नाम स्थान में अपनी पिछली स्थिति से, फंक्शंस मल मॉड्यूल में ले जाया जा रहा है
— एली

1
@ एलीबेन: भविष्य के तनाव में पायथन 3 के बारे में क्यों बात करें? कमी अभी भी है । reduceहै functools.reduce अजगर 3 में
— u0b34a0f6ae

यदि आप हटाते हैं , True, तो यह उत्तर केवल प्रश्न के कोड के बराबर ही होगा, गैर-बूलियन सूचियों के लिए।
— थॉमस अहले

10

इस तरह के ऑपरेशन के लिए मुहावरा reduceफ़ंक्शन का उपयोग करना है (Python 2.X में वैश्विक, functoolsPython 3.X में मॉड्यूल में मॉड्यूल ) एक उपयुक्त बाइनरी ऑपरेटर के साथ या तो operatorमॉड्यूल से लिया गया है या स्पष्ट रूप से कोडित किया गया है। आपके मामले में, यह हैoperator.and_

reduce(operator.and_, [True, True, False])

4

यहाँ एक और उपाय है:

def my_and(a_list):
    return not (False in a_list)

def my_or(a_list):
    return True in a_list

यदि सभी तत्व सत्य हैं, तो सभी तत्व सही हो जाएंगे, इसलिए सूची में कोई गलत नहीं है। ओरिंग समान है, लेकिन यह सच लौटना चाहिए अगर कम से कम एक ट्रू वैल्यू एक सूची में मौजूद है।


0

जैसा कि अन्य उत्तर बताते हैं, इस कार्य को पूरा करने के कई तरीके हैं। यहाँ एक और समाधान है जो मानक पुस्तकालय से कार्यों का उपयोग करता है:

from functools import partial

apply_and = all
apply_or = any
apply_not = partial(map, lambda x: not x)

if __name__ == "__main__":
    ls = [True, True, False, True, False, True]
    print "Original: ", ls
    print "and: ", apply_and(ls)
    print "or: ", apply_or(ls)
    print "not: ", apply_not(ls)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.