Testing equality of three values

Python

Python Problem Overview


Does this do what I think it does? It seems to me that yes. I am asking to be sure.

if n[i] == n[i+1] == n[i+2]:
    return True

Are these equal?

if n[i] == n[i+1] and n[i+1] == n[i+2]:
    return True

Python Solutions


Solution 1 - Python

It is equivalent to but not equal to, since accesses are only performed once. Python chains relational operators naturally (including in and is).

The easiest way to show the slight difference:

>>> print(1) == print(2) == print(3)
1
2
3
True
>>> print(1) == print(2) and print(2) == print(3)
1
2
2
3
True

print() always returns None, so all we are doing is comparing Nones here, so the result is always True, but note that in the second case, print(2) is called twice, so we get two 2s in the output, while in the first case, the result is used for both comparisons, so it is only executed once.

If you use pure functions with no side-effects, the two operations end up exactly the same, but otherwise they are a little different.

Solution 2 - Python

Yes, however, when the comparisons are chained the common expression is evaluated once, when using and it's evaluated twice. In both cases the second comparison is not evaluated if the first one is false, example from the docs:

> Comparisons can be chained arbitrarily, e.g., x < y <= z is equivalent > to x < y and y <= z, except that y is evaluated only once (but in both > cases z is not evaluated at all when x < y is found to be false).

Solution 3 - Python

As answered by others, the answer is yes. However: beware of adding parentheses. For example:

>>> 1 == 2 == 0
False
>>> (1 == 2) == 0
True

In the second case, (1 == 2) evaluates to False, and then False == 0 evaluates to True, because Python allows comparison of booleans to integers.

Likewise:

>>> 0 == 0 == 1
False
>>> (0 == 0) == 1
True

Solution 4 - Python

yes you are correct ....

you can also do

5 > x > 1

or

1 < x < 5

Solution 5 - Python

You can use set collection to test the equality

>>> a, b, c = 2, 2, 2
>>> len({a, b, c}) == 1
True
>>> a, b, c = 2, 2, 3
>>> len({a, b, c}) == 1
False

Solution 6 - Python

Yep, at the python's internals the comparison operators returns nor true neither false, they instead return the 'comparison result' object (cannot remember the class name, it was quite in past), and this object provides the lt, gt, eq etc etc methods and become 'responsible' for the final result (and the 'comparison result' is casting to True or False at end of statement). That's a magic of semantic control python provides to you :)

Solution 7 - Python

It seems that you can also chain == with !=:

>>> a = b = c = 1
>>> a == b == c
True
>>> a == b == c == 1
True
>>> a == b == c == 2
False
>>> a == b == c != 2
True
>>> a == b == c != 1
False
>>> 

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestiongraywolfView Question on Stackoverflow
Solution 1 - PythonIgnacio Vazquez-AbramsView Answer on Stackoverflow
Solution 2 - PythoniabdalkaderView Answer on Stackoverflow
Solution 3 - PythonAaron Dunigan AtLeeView Answer on Stackoverflow
Solution 4 - PythonJoran BeasleyView Answer on Stackoverflow
Solution 5 - PythonPikesh PrasoonView Answer on Stackoverflow
Solution 6 - PythonVB9-UANICView Answer on Stackoverflow
Solution 7 - PythonQ. QiaoView Answer on Stackoverflow