Is there any way to make an element in a list equal all integers?

Question:

I am trying to get these two list to equal one another:

a = [None, 3, 4, 5, 8, 9, None, 0, -3, 2, None, None, None]
b = [0, 3, 4, 5, 8, 9, 0, 0, -3, 2, 0, 0, 0]
if a == b:
    print("yay or sth")

Currently I have None as a placeholder.
other than using a for loop and checking every single one, is there any way to achieve that?

Asked By: s11010

||

Answers:

== is supposed to be transitive: if a == b and b == c, then a == c. But such a placeholder would violate that.

Better to simplify define another function to make the comparison you want instead of making __eq__ do something it should not.

def basically_equal(l1, l2):
    return all(x is None or y is None or x == y for x, y in zip(l1, l2))

if basically_equal(a, b):
    print("a and b equal up to placeholder values")
Answered By: chepner

As chepner noted in the comments, you could create a class with a __eq__ method that always returns True. Then you could create a global variable with an instance of the class and use, like this:

class EqualClass():
    def __eq__(self, obj):
        return True


Equal = EqualClass()

a = [Equal, 3, 4, 5, 8, 9, Equal, 0, -3, 2, Equal, Equal, Equal]
b = [0, 3, 4, 5, 8, 9, 0, 0, -3, 2, 0, 0, 0]

Or, as Kelly Bundy pointed out in a comment, you can use unittest.mock.ANY (source code). Like this:

from unittest.mock import ANY

a = [ANY, 3, 4, 5, 8, 9, ANY, 0, -3, 2, ANY, ANY, ANY]
b = [0, 3, 4, 5, 8, 9, 0, 0, -3, 2, 0, 0, 0]
print(a == b)  # => True

However, be sure to see chepner’s answer regarding transitivity and why this may be a bad idea.

Answered By: Michael M.

You can use numpy to vectorize it.

import numpy as np

a = np.array([None, 3, 4, 5, 8, 9, None, 0, -3, 2, None, None, None])
b = np.array([0, 3, 4, 5, 8, 9, 0, 0, -3, 2, 0, 0, 0])

# map non matching from b onto a.
a[~(a==b)] = b[~(a==b)]

if all(a == b):
    print("yay or sth")

Answered By: Joynul Islam
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.