पायथन के किसी भी और सभी कार्य कैसे काम करते हैं?


225

मैं समझता हूँ कि कैसे कोशिश कर रहा हूँ any()और all()अजगर बिल्ट-इन कार्य काम करते हैं।

मैं टुपल्स की तुलना करने की कोशिश कर रहा हूं ताकि यदि कोई मूल्य अलग हो तो वह वापस आ जाए Trueऔर यदि वे सभी समान हैं तो वापस आ जाएंगे False। इस मामले में वे कैसे काम कर रहे हैं [झूठी, झूठी, झूठी] वापसी करने के लिए?

dएक है defaultdict(list)

print d['Drd2']
# [[1, 5, 0], [1, 6, 0]]
print list(zip(*d['Drd2']))
# [(1, 1), (5, 6), (0, 0)]
print [any(x) and not all(x) for x in zip(*d['Drd2'])]
# [False, False, False]

मेरी जानकारी के लिए, यह आउटपुट होना चाहिए

# [False, True, False]

चूँकि (1,1) समान हैं, (5,6) भिन्न हैं, और (0,0) समान हैं।

यह सभी टुपल्स के लिए गलत का मूल्यांकन क्यों कर रहा है?


4
कोई (पुनरावृत्ति): सत्य वस्तु की पहली मुठभेड़ पर सच लौटाता है और दूसरा झूठा मिलता है। सभी (पुनरावृत्त): मिथ्या वस्तु की पहली मुठभेड़ पर रिटर्न फ़्लेस और अन्य सही है।
शैडो ०३५

जवाबों:


375

आप मोटे तौर पर के बारे में सोच सकते हैं anyऔर allतार्किक की श्रृंखला के रूप में orऔर andऑपरेटरों, क्रमशः।

कोई भी

anyकम से कम एक तत्व के सत्य Trueहोने पर वापस आ जाएगा । सत्य मूल्य परीक्षण के बारे में पढ़ें

सब

allसभी तत्व सत्य Trueहोने पर ही वापस लौटेंगे।

सच्ची तालिका

+-----------------------------------------+---------+---------+
|                                         |   any   |   all   |
+-----------------------------------------+---------+---------+
| All Truthy values                       |  True   |  True   |
+-----------------------------------------+---------+---------+
| All Falsy values                        |  False  |  False  |
+-----------------------------------------+---------+---------+
| One Truthy value (all others are Falsy) |  True   |  False  |
+-----------------------------------------+---------+---------+
| One Falsy value (all others are Truthy) |  True   |  False  |
+-----------------------------------------+---------+---------+
| Empty Iterable                          |  False  |  True   |
+-----------------------------------------+---------+---------+

नोट 1: खाली पुनरावृत्त मामले को इस तरह से आधिकारिक दस्तावेज में समझाया गया है

any

Trueयदि पुनरावृत्ति का कोई भी तत्व सत्य है, तो वापस लौटें । यदि चलने योग्य खाली है, तो वापस लौटेंFalse

चूंकि कोई भी तत्व सत्य नहीं है, इसलिए यह Falseइस मामले में वापस आ जाता है।

all

वापसी करें Trueयदि चलने योग्य के सभी तत्व सही हैं ( या यदि चलने योग्य खाली है )।

चूंकि कोई भी तत्व गलत नहीं है, इसलिए यह Trueइस मामले में वापस आ जाता है।


नोट 2:

एक अन्य महत्वपूर्ण बात के बारे में पता करने के लिए anyऔर allहै, यह शॉर्ट सर्किट निष्पादन, पल वे परिणाम पता चल जाएगा। लाभ यह है कि संपूर्ण पुनरावृत्ति की आवश्यकता नहीं है। उदाहरण के लिए,

>>> multiples_of_6 = (not (i % 6) for i in range(1, 10))
>>> any(multiples_of_6)
True
>>> list(multiples_of_6)
[False, False, False]

इधर, (not (i % 6) for i in range(1, 10))एक जनरेटर अभिव्यक्ति जो रिटर्न है Trueअगर 1 और 9 के भीतर मौजूदा नंबर 6 की एक बहु है anyदोहराता multiples_of_6है और जब यह पूरा करती है 6, यह एक Truthy मूल्य पाता है, इसे तुरंत तो रिटर्न True, और के आराम multiples_of_6दोहराया नहीं है। यह तब होता है जब हम प्रिंट करते हैं list(multiples_of_6), जिसके परिणामस्वरूप 7, 8और 9

इस उत्तर में इस बेहतरीन चीज का बहुत ही चतुराई से इस्तेमाल किया गया है ।


इस बुनियादी समझ के साथ, यदि हम आपके कोड को देखते हैं, तो आप करते हैं

any(x) and not all(x)

जो यह सुनिश्चित करता है कि, मूल्यों में से कम से कम एक सत्य है, लेकिन उनमें से सभी नहीं। इसलिए लौट रहा है [False, False, False]। यदि आप वास्तव में जाँचना चाहते हैं कि क्या दोनों संख्याएँ समान नहीं हैं,

print [x[0] != x[1] for x in zip(*d['Drd2'])]

@ डियान: अगर मुझे सभी का उपयोग करने की आवश्यकता है, लेकिन जिस मामले में यह सच है, खाली सूची के लिए यह स्वीकार्य नहीं है, तो हम क्या करते हैं? मैं सही नहीं देने के पीछे के तर्क को समझता हूँ यदि सूची खाली है ... अर्थ सभी ([]) == सच
जावा

1
@JavaSa आप स्पष्ट रूप से देख सकते हैं कि सूची खाली है या नहीं। मेरा मानना ​​है कि कुछ bool(data) and all(...)काम करना चाहिए।
Thefourtheye

43

पायथन anyऔर allफ़ंक्शंस कैसे काम करते हैं?

anyऔर allपुनरावृत्तियां लें और Trueयदि कोई हो और तत्वों के सभी (क्रमशः) वापस आ जाएं True

>>> any([0, 0.0, False, (), '0']), all([1, 0.0001, True, (False,)])
(True, True)            #   ^^^-- truthy non-empty string
>>> any([0, 0.0, False, (), '']), all([1, 0.0001, True, (False,), {}])
(False, False)                                                #   ^^-- falsey

यदि पुनरावृत्तियां खाली हैं, तो anyरिटर्न False, और allरिटर्न True

>>> any([]), all([])
(False, True)

मैं प्रदर्शन किया गया था allऔर anyआज कक्षा में छात्रों के लिए। वे ज्यादातर खाली पुनरावृत्तियों के लिए वापसी मूल्यों के बारे में भ्रमित थे। इसे इस तरह समझाते हुए बहुत सारे लाइटबुल चालू हो गए।

शार्टकटिंग व्यवहार

वे, anyऔर all, दोनों एक ऐसी स्थिति की तलाश करते हैं जो उन्हें मूल्यांकन बंद करने की अनुमति देती है। पहले उदाहरण मैंने उन्हें पूरी सूची में प्रत्येक तत्व के लिए बूलियन का मूल्यांकन करने के लिए आवश्यक दिया।

(ध्यान दें कि सूची शाब्दिक रूप से स्वयं आलसी का मूल्यांकन नहीं किया जाता है - आप इसे एक Iterator के साथ प्राप्त कर सकते हैं - लेकिन यह सिर्फ उदाहरण के लिए है।)

यहाँ किसी और सभी का पायथन कार्यान्वयन है:

def any(iterable):
    for i in iterable:
        if i:
            return True
    return False # for an empty iterable, any returns False!

def all(iterable):
    for i in iterable:
        if not i:
            return False
    return True  # for an empty iterable, all returns True!

बेशक, वास्तविक कार्यान्वयन सी में लिखे गए हैं और बहुत अधिक प्रदर्शनकारी हैं, लेकिन आप उपरोक्त विकल्प दे सकते हैं और इस (या किसी अन्य) उत्तर में कोड के लिए समान परिणाम प्राप्त कर सकते हैं।

all

allतत्वों के लिए जाँच की जा सकती है False(इसलिए यह वापस आ सकती है False), तो यह वापस आ जाता है Trueअगर उनमें से कोई भी नहीं था False

>>> all([1, 2, 3, 4])                 # has to test to the end!
True
>>> all([0, 1, 2, 3, 4])              # 0 is False in a boolean context!
False  # ^--stops here!
>>> all([])
True   # gets to end, so True!

any

जिस तरह से anyकाम करता है कि यह तत्वों के लिए जाँच करता है True(इसलिए यह True), then it returnsफाल्स if none of them wereट्रू` लौटा सकता है ।

>>> any([0, 0.0, '', (), [], {}])     # has to test to the end!
False
>>> any([1, 0, 0.0, '', (), [], {}])  # 1 is True in a boolean context!
True   # ^--stops here!
>>> any([])
False   # gets to end, so False!

मुझे लगता है कि यदि आप शॉर्ट-कटिंग व्यवहार को ध्यान में रखते हैं, तो आप सहजता से समझ पाएंगे कि कैसे वे एक ट्रुथ टेबल का संदर्भ लिए बिना काम करते हैं।

के साक्ष्य allऔर anyशॉर्टकट:

सबसे पहले, एक नॉइज़_ राइटर बनाएं:

def noisy_iterator(iterable):
    for i in iterable:
        print('yielding ' + repr(i))
        yield i

और अब आइए हमारे उदाहरणों का उपयोग करते हुए, केवल सूचियों पर पुनरावृति करें:

>>> all(noisy_iterator([1, 2, 3, 4]))
yielding 1
yielding 2
yielding 3
yielding 4
True
>>> all(noisy_iterator([0, 1, 2, 3, 4]))
yielding 0
False

हम allपहली झूठी बूलियन जांच पर स्टॉप देख सकते हैं ।

और anyपहले सच्चे बूलियन चेक पर रुक जाता है:

>>> any(noisy_iterator([0, 0.0, '', (), [], {}]))
yielding 0
yielding 0.0
yielding ''
yielding ()
yielding []
yielding {}
False
>>> any(noisy_iterator([1, 0, 0.0, '', (), [], {}]))
yielding 1
True

स्रोत

उपरोक्त पुष्टि करने के लिए स्रोत पर नजर डालते हैं।

यहाँ के लिए स्रोत हैany :

static PyObject *
builtin_any(PyObject *module, PyObject *iterable)
{
    PyObject *it, *item;
    PyObject *(*iternext)(PyObject *);
    int cmp;

    it = PyObject_GetIter(iterable);
    if (it == NULL)
        return NULL;
    iternext = *Py_TYPE(it)->tp_iternext;

    for (;;) {
        item = iternext(it);
        if (item == NULL)
            break;
        cmp = PyObject_IsTrue(item);
        Py_DECREF(item);
        if (cmp < 0) {
            Py_DECREF(it);
            return NULL;
        }
        if (cmp > 0) {
            Py_DECREF(it);
            Py_RETURN_TRUE;
        }
    }
    Py_DECREF(it);
    if (PyErr_Occurred()) {
        if (PyErr_ExceptionMatches(PyExc_StopIteration))
            PyErr_Clear();
        else
            return NULL;
    }
    Py_RETURN_FALSE;
}

और यहाँ के लिए स्रोत हैall :

static PyObject *
builtin_all(PyObject *module, PyObject *iterable)
{
    PyObject *it, *item;
    PyObject *(*iternext)(PyObject *);
    int cmp;

    it = PyObject_GetIter(iterable);
    if (it == NULL)
        return NULL;
    iternext = *Py_TYPE(it)->tp_iternext;

    for (;;) {
        item = iternext(it);
        if (item == NULL)
            break;
        cmp = PyObject_IsTrue(item);
        Py_DECREF(item);
        if (cmp < 0) {
            Py_DECREF(it);
            return NULL;
        }
        if (cmp == 0) {
            Py_DECREF(it);
            Py_RETURN_FALSE;
        }
    }
    Py_DECREF(it);
    if (PyErr_Occurred()) {
        if (PyErr_ExceptionMatches(PyExc_StopIteration))
            PyErr_Clear();
        else
            return NULL;
    }
    Py_RETURN_TRUE;
}

1
नोट: यह गणित की भविष्यवाणी के अनुरूप है: "सभी के लिए" और "यह मौजूद है"। भ्रम यह हो सकता है कि "सभी के लिए" और "किसी के लिए" अन्य संदर्भों में समानार्थी हैं ... en.wikipedia.org/wiki/List_of_logic_symbols
mcoolive

1
@ thanos.a यह अंदर है Python/bltinmodule.c- मैंने इसे ऊपर से जोड़ा।
हारून हॉल

14

मुझे पता है कि यह पुराना है, लेकिन मैंने सोचा कि यह दिखाना उपयोगी हो सकता है कि ये फ़ंक्शन कोड में क्या दिखते हैं। यह वास्तव में पाठ या किसी तालिका IMO से बेहतर, तर्क का चित्रण करता है। वास्तव में वे शुद्ध पायथन के बजाय सी में कार्यान्वित किए जाते हैं, लेकिन ये समान हैं।

def any(iterable):
    for item in iterable:
        if item:
            return True
    return False

def all(iterable):
    for item in iterable:
        if not item:
            return False
    return True

विशेष रूप से, आप देख सकते हैं कि खाली पुनरावृत्तियों के लिए परिणाम केवल प्राकृतिक परिणाम है, विशेष मामला नहीं। आप शॉर्ट-सर्किटिंग व्यवहार भी देख सकते हैं; यह वास्तव में अधिक काम हो वहाँ के लिए होता नहीं करने के लिए शॉर्ट-सर्किट हो।

जब गुइडो वैन रोसुम (पायथन के निर्माता) ने पहली बार जोड़ने का प्रस्ताव रखा any()औरall() , उन्होंने कोड के ठीक ऊपर के स्निपेट पोस्ट करके उन्हें समझाया।


9

जिस कोड के बारे में आप पूछ रहे हैं, वह मेरे दिए गए उत्तर से आता है । यह कई बिट सरणियों की तुलना की समस्या को हल करने का इरादा था - अर्थात 1और का संग्रह 0

anyऔर allउपयोगी हैं जब आप मूल्यों की "सत्यता" पर भरोसा कर सकते हैं - अर्थात एक बूलियन संदर्भ में उनका मूल्य। 1 है Trueऔर 0 है False, एक सुविधा है जो उत्तोलन का उत्तर देती है। 5 भी होता है True, इसलिए जब आप इसे अपने संभावित इनपुट में मिलाते हैं ... अच्छी तरह से। काम नहीं करता है।

आप इसके बजाय कुछ ऐसा कर सकते हैं:

[len(set(x)) > 1 for x in zip(*d['Drd2'])]

इसमें पिछले उत्तर के सौंदर्यशास्त्र का अभाव है (मुझे वास्तव में पसंद आया any(x) and not all(x)), लेकिन यह काम पूरा करता है।


Colbert का प्रभाव CS / CE: en.wikipedia.org/wiki/Truthiness तक पहुँच रहा है ? क्या हम फजी लॉजिक बोल रहे हैं? : डी
जियोफ सेवेया

जैसा कि ओपी ने पूछा कि Trueजब मान अलग-अलग होते हैं, तो सेट की लंबाई 2 होनी चाहिए, न कि 1.
wombatonfire

@wombatonfire हाहा अच्छी पकड़। मैंने अपने 7 साल पुराने उत्तर को समायोजित किया है :)
रोपी



1

अवधारणा सरल है:

M =[(1, 1), (5, 6), (0, 0)]

1) print([any(x) for x in M])
[True, True, False] #only the last tuple does not have any true element

2) print([all(x) for x in M])
[True, True, False] #all elements of the last tuple are not true

3) print([not all(x) for x in M])
[False, False, True] #NOT operator applied to 2)

4) print([any(x)  and not all(x) for x in M])
[False, False, False] #AND operator applied to 1) and 3)
# if we had M =[(1, 1), (5, 6), (1, 0)], we could get [False, False, True]  in 4)
# because the last tuple satisfies both conditions: any of its elements is TRUE 
#and not all elements are TRUE 

0
list = [1,1,1,0]
print(any(list)) # will return True because there is  1 or True exists
print(all(list)) # will return False because there is a 0 or False exists
return all(a % i for i in range(3, int(a ** 0.5) + 1)) # when number is divisible it will return False else return True but the whole statement is False .
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.