Why are 'and/or' operations in this Python statement behaving unexpectedly?












7















I have a conceptual question about Python. This is the code



list1=['assistant manager', 'salesperson', 'doctor', 'production manager', 'sales manager', 'schoolteacher', 'mathematics teacher']
sub1 = "teacher"
sub2 = "sales"
ans=

for item in list1:
if (sub1 and sub2) in item:
ans.append(item)


Here, I expect the list to be empty as none of the items satisfy the condition if sub1 and sub2 in item: But when I print the list I get the output#1 as this



>>> ans
['salesperson', 'sales manager'] # I expected an empty list here


Also, when I use or instead of and as given below



for item in list1:
if (sub1 or sub2) in item:
ans.append(item)


the output#2 I get is



>>> ans
['schoolteacher', 'mathematics teacher'] # I expected a list of words containing sub1 or sub2 as their substrings


I saw a similar looking solution here, but it does not exactly solve my problem. Both the times I get a result which I do not expect while using and and or. Why is this happening during both these operations?










share|improve this question




















  • 1





    (sub1 and sub2) in item what will be the result of the expression in the brackets? That will be checked against item.

    – Klaus D.
    7 hours ago













  • Change (sub1 and sub2) in item to sub1 in item and sub2 in item

    – Tom Karzes
    7 hours ago








  • 1





    Possible duplicate of can Python 'and' return None?

    – user5173426
    7 hours ago
















7















I have a conceptual question about Python. This is the code



list1=['assistant manager', 'salesperson', 'doctor', 'production manager', 'sales manager', 'schoolteacher', 'mathematics teacher']
sub1 = "teacher"
sub2 = "sales"
ans=

for item in list1:
if (sub1 and sub2) in item:
ans.append(item)


Here, I expect the list to be empty as none of the items satisfy the condition if sub1 and sub2 in item: But when I print the list I get the output#1 as this



>>> ans
['salesperson', 'sales manager'] # I expected an empty list here


Also, when I use or instead of and as given below



for item in list1:
if (sub1 or sub2) in item:
ans.append(item)


the output#2 I get is



>>> ans
['schoolteacher', 'mathematics teacher'] # I expected a list of words containing sub1 or sub2 as their substrings


I saw a similar looking solution here, but it does not exactly solve my problem. Both the times I get a result which I do not expect while using and and or. Why is this happening during both these operations?










share|improve this question




















  • 1





    (sub1 and sub2) in item what will be the result of the expression in the brackets? That will be checked against item.

    – Klaus D.
    7 hours ago













  • Change (sub1 and sub2) in item to sub1 in item and sub2 in item

    – Tom Karzes
    7 hours ago








  • 1





    Possible duplicate of can Python 'and' return None?

    – user5173426
    7 hours ago














7












7








7


0






I have a conceptual question about Python. This is the code



list1=['assistant manager', 'salesperson', 'doctor', 'production manager', 'sales manager', 'schoolteacher', 'mathematics teacher']
sub1 = "teacher"
sub2 = "sales"
ans=

for item in list1:
if (sub1 and sub2) in item:
ans.append(item)


Here, I expect the list to be empty as none of the items satisfy the condition if sub1 and sub2 in item: But when I print the list I get the output#1 as this



>>> ans
['salesperson', 'sales manager'] # I expected an empty list here


Also, when I use or instead of and as given below



for item in list1:
if (sub1 or sub2) in item:
ans.append(item)


the output#2 I get is



>>> ans
['schoolteacher', 'mathematics teacher'] # I expected a list of words containing sub1 or sub2 as their substrings


I saw a similar looking solution here, but it does not exactly solve my problem. Both the times I get a result which I do not expect while using and and or. Why is this happening during both these operations?










share|improve this question
















I have a conceptual question about Python. This is the code



list1=['assistant manager', 'salesperson', 'doctor', 'production manager', 'sales manager', 'schoolteacher', 'mathematics teacher']
sub1 = "teacher"
sub2 = "sales"
ans=

for item in list1:
if (sub1 and sub2) in item:
ans.append(item)


Here, I expect the list to be empty as none of the items satisfy the condition if sub1 and sub2 in item: But when I print the list I get the output#1 as this



>>> ans
['salesperson', 'sales manager'] # I expected an empty list here


Also, when I use or instead of and as given below



for item in list1:
if (sub1 or sub2) in item:
ans.append(item)


the output#2 I get is



>>> ans
['schoolteacher', 'mathematics teacher'] # I expected a list of words containing sub1 or sub2 as their substrings


I saw a similar looking solution here, but it does not exactly solve my problem. Both the times I get a result which I do not expect while using and and or. Why is this happening during both these operations?







python logical-operators






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited 44 mins ago









Peter Mortensen

13.7k1986112




13.7k1986112










asked 7 hours ago









satyasatya

15012




15012








  • 1





    (sub1 and sub2) in item what will be the result of the expression in the brackets? That will be checked against item.

    – Klaus D.
    7 hours ago













  • Change (sub1 and sub2) in item to sub1 in item and sub2 in item

    – Tom Karzes
    7 hours ago








  • 1





    Possible duplicate of can Python 'and' return None?

    – user5173426
    7 hours ago














  • 1





    (sub1 and sub2) in item what will be the result of the expression in the brackets? That will be checked against item.

    – Klaus D.
    7 hours ago













  • Change (sub1 and sub2) in item to sub1 in item and sub2 in item

    – Tom Karzes
    7 hours ago








  • 1





    Possible duplicate of can Python 'and' return None?

    – user5173426
    7 hours ago








1




1





(sub1 and sub2) in item what will be the result of the expression in the brackets? That will be checked against item.

– Klaus D.
7 hours ago







(sub1 and sub2) in item what will be the result of the expression in the brackets? That will be checked against item.

– Klaus D.
7 hours ago















Change (sub1 and sub2) in item to sub1 in item and sub2 in item

– Tom Karzes
7 hours ago







Change (sub1 and sub2) in item to sub1 in item and sub2 in item

– Tom Karzes
7 hours ago






1




1





Possible duplicate of can Python 'and' return None?

– user5173426
7 hours ago





Possible duplicate of can Python 'and' return None?

– user5173426
7 hours ago












2 Answers
2






active

oldest

votes


















14














("teacher" and "sales") in "salesmanager" do not mean the same in Python and in English.



In English, it is synonynous to ("teacher" in "salesmanager") and ("sales" in "salesmanager") (which Python would understand as you thought it should, and evaluate to False).



Python on the other hand will first evaluate "teacher" and "sales", because it is in parentheses, and thus has higher priority. and will return the first argument if falsy, otherwise the second argument. "teacher" is not falsy, so "teacher" and "sales" evaluates as "sales". Then, Python continues to evaluate "sales" in "salesmanager", and returns True.






share|improve this answer
























  • So far as I know, all languages give parentheses first priority, not just Python. But you are correct in explaining what Python returns for ( X and Y )

    – Carl Witthoft
    45 mins ago



















5














The and and or operators don't do what you think they do. Try breaking up your expressions:



if sub1 in item or sub2 in item:

if sub1 in item and sub2 in item:


The and operator evaluates its left-hand operand and, if the result is truthy, returns the right-hand operand, otherwise the left-hand operand.



The or operator evaluates its left-hand operand and, if the result is falsy, returns the right-hand operand, otherwise the left-hand operand.



So, in your first expression evaluates as follows:



(sub1 and sub2) in item
("teacher" and "sales") in item
("sales") in item


which is not what you expected.



Similarly for your second expression:



(sub1 or sub2) in item
("teacher" or "sales") in item
("teacher") in item





share|improve this answer























    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54821841%2fwhy-are-and-or-operations-in-this-python-statement-behaving-unexpectedly%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    2 Answers
    2






    active

    oldest

    votes








    2 Answers
    2






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    14














    ("teacher" and "sales") in "salesmanager" do not mean the same in Python and in English.



    In English, it is synonynous to ("teacher" in "salesmanager") and ("sales" in "salesmanager") (which Python would understand as you thought it should, and evaluate to False).



    Python on the other hand will first evaluate "teacher" and "sales", because it is in parentheses, and thus has higher priority. and will return the first argument if falsy, otherwise the second argument. "teacher" is not falsy, so "teacher" and "sales" evaluates as "sales". Then, Python continues to evaluate "sales" in "salesmanager", and returns True.






    share|improve this answer
























    • So far as I know, all languages give parentheses first priority, not just Python. But you are correct in explaining what Python returns for ( X and Y )

      – Carl Witthoft
      45 mins ago
















    14














    ("teacher" and "sales") in "salesmanager" do not mean the same in Python and in English.



    In English, it is synonynous to ("teacher" in "salesmanager") and ("sales" in "salesmanager") (which Python would understand as you thought it should, and evaluate to False).



    Python on the other hand will first evaluate "teacher" and "sales", because it is in parentheses, and thus has higher priority. and will return the first argument if falsy, otherwise the second argument. "teacher" is not falsy, so "teacher" and "sales" evaluates as "sales". Then, Python continues to evaluate "sales" in "salesmanager", and returns True.






    share|improve this answer
























    • So far as I know, all languages give parentheses first priority, not just Python. But you are correct in explaining what Python returns for ( X and Y )

      – Carl Witthoft
      45 mins ago














    14












    14








    14







    ("teacher" and "sales") in "salesmanager" do not mean the same in Python and in English.



    In English, it is synonynous to ("teacher" in "salesmanager") and ("sales" in "salesmanager") (which Python would understand as you thought it should, and evaluate to False).



    Python on the other hand will first evaluate "teacher" and "sales", because it is in parentheses, and thus has higher priority. and will return the first argument if falsy, otherwise the second argument. "teacher" is not falsy, so "teacher" and "sales" evaluates as "sales". Then, Python continues to evaluate "sales" in "salesmanager", and returns True.






    share|improve this answer













    ("teacher" and "sales") in "salesmanager" do not mean the same in Python and in English.



    In English, it is synonynous to ("teacher" in "salesmanager") and ("sales" in "salesmanager") (which Python would understand as you thought it should, and evaluate to False).



    Python on the other hand will first evaluate "teacher" and "sales", because it is in parentheses, and thus has higher priority. and will return the first argument if falsy, otherwise the second argument. "teacher" is not falsy, so "teacher" and "sales" evaluates as "sales". Then, Python continues to evaluate "sales" in "salesmanager", and returns True.







    share|improve this answer












    share|improve this answer



    share|improve this answer










    answered 7 hours ago









    AmadanAmadan

    131k13143196




    131k13143196













    • So far as I know, all languages give parentheses first priority, not just Python. But you are correct in explaining what Python returns for ( X and Y )

      – Carl Witthoft
      45 mins ago



















    • So far as I know, all languages give parentheses first priority, not just Python. But you are correct in explaining what Python returns for ( X and Y )

      – Carl Witthoft
      45 mins ago

















    So far as I know, all languages give parentheses first priority, not just Python. But you are correct in explaining what Python returns for ( X and Y )

    – Carl Witthoft
    45 mins ago





    So far as I know, all languages give parentheses first priority, not just Python. But you are correct in explaining what Python returns for ( X and Y )

    – Carl Witthoft
    45 mins ago













    5














    The and and or operators don't do what you think they do. Try breaking up your expressions:



    if sub1 in item or sub2 in item:

    if sub1 in item and sub2 in item:


    The and operator evaluates its left-hand operand and, if the result is truthy, returns the right-hand operand, otherwise the left-hand operand.



    The or operator evaluates its left-hand operand and, if the result is falsy, returns the right-hand operand, otherwise the left-hand operand.



    So, in your first expression evaluates as follows:



    (sub1 and sub2) in item
    ("teacher" and "sales") in item
    ("sales") in item


    which is not what you expected.



    Similarly for your second expression:



    (sub1 or sub2) in item
    ("teacher" or "sales") in item
    ("teacher") in item





    share|improve this answer




























      5














      The and and or operators don't do what you think they do. Try breaking up your expressions:



      if sub1 in item or sub2 in item:

      if sub1 in item and sub2 in item:


      The and operator evaluates its left-hand operand and, if the result is truthy, returns the right-hand operand, otherwise the left-hand operand.



      The or operator evaluates its left-hand operand and, if the result is falsy, returns the right-hand operand, otherwise the left-hand operand.



      So, in your first expression evaluates as follows:



      (sub1 and sub2) in item
      ("teacher" and "sales") in item
      ("sales") in item


      which is not what you expected.



      Similarly for your second expression:



      (sub1 or sub2) in item
      ("teacher" or "sales") in item
      ("teacher") in item





      share|improve this answer


























        5












        5








        5







        The and and or operators don't do what you think they do. Try breaking up your expressions:



        if sub1 in item or sub2 in item:

        if sub1 in item and sub2 in item:


        The and operator evaluates its left-hand operand and, if the result is truthy, returns the right-hand operand, otherwise the left-hand operand.



        The or operator evaluates its left-hand operand and, if the result is falsy, returns the right-hand operand, otherwise the left-hand operand.



        So, in your first expression evaluates as follows:



        (sub1 and sub2) in item
        ("teacher" and "sales") in item
        ("sales") in item


        which is not what you expected.



        Similarly for your second expression:



        (sub1 or sub2) in item
        ("teacher" or "sales") in item
        ("teacher") in item





        share|improve this answer













        The and and or operators don't do what you think they do. Try breaking up your expressions:



        if sub1 in item or sub2 in item:

        if sub1 in item and sub2 in item:


        The and operator evaluates its left-hand operand and, if the result is truthy, returns the right-hand operand, otherwise the left-hand operand.



        The or operator evaluates its left-hand operand and, if the result is falsy, returns the right-hand operand, otherwise the left-hand operand.



        So, in your first expression evaluates as follows:



        (sub1 and sub2) in item
        ("teacher" and "sales") in item
        ("sales") in item


        which is not what you expected.



        Similarly for your second expression:



        (sub1 or sub2) in item
        ("teacher" or "sales") in item
        ("teacher") in item






        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered 7 hours ago









        RobᵩRobᵩ

        116k13138222




        116k13138222






























            draft saved

            draft discarded




















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54821841%2fwhy-are-and-or-operations-in-this-python-statement-behaving-unexpectedly%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Polycentropodidae

            Magento 2 Error message: Invalid state change requested

            Paulmy