tung
tung

Reputation: 119

Python initialize a dictionary with condition values

When I initialize the check_dict, will all the values(condition) be calculated(become boolean values), if yes will it be not efficient if I put conditon be dictionary's value, is there any better way to do it?

def checker(fruit: str, number: int) -> bool:
    check_dict = {
        "apple": True if number > 3 else False,
        "banana": True if number < 2 else False,
        "watermelon": True if number > 10 else False
    }
    res = check_dict.get(fruit, None)
    if res:
        return res

ans = checker(fruit="apple", number=4)
print(ans)

Upvotes: 2

Views: 968

Answers (3)

AGN Gazer
AGN Gazer

Reputation: 8378

If the checker function is intended to be called repeatedly and maybe the list of fruits is larger, one way of optimizing this is to pull the dictionary creation outside of the checker function like this:

check_dict = {
    "apple": lambda x: x > 3,
    "banana": lambda x: x < 2,
    "watermelon": lambda x: x > 10,
}

def checker3(fruit: str, number: int) -> bool:
    return check_dict.get(fruit)(number)

Upvotes: 0

Andrej Kesely
Andrej Kesely

Reputation: 195553

Why construct a dictionary? Simple if-else is enough:

def checker(fruit: str, number: int) -> bool:
    if fruit == "apple":
        return number > 3
    elif fruit == "banana":
        return number < 2
    elif fruit == "watermelon":
        return number > 10


ans = checker(fruit="apple", number=4)
print(ans)

EDIT: Small benchmark:

from timeit import timeit


def checker1(fruit: str, number: int) -> bool:
    if fruit == "apple":
        return number > 3
    elif fruit == "banana":
        return number < 2
    elif fruit == "watermelon":
        return number > 10


def checker2(fruit: str, number: int) -> bool:
    check_dict = {
        "apple": True if number > 3 else False,
        "banana": True if number < 2 else False,
        "watermelon": True if number > 10 else False,
    }
    res = check_dict.get(fruit, None)
    if res:
        return res


t1 = timeit('checker1("watermelon", 4)', number=1_000_000, globals=globals())
t2 = timeit('checker2("watermelon", 4)', number=1_000_000, globals=globals())

print(t1)
print(t2)

Prints:

0.10748997700284235
0.23576407400832977

Upvotes: 3

555Russich
555Russich

Reputation: 404

You can do it a little bit shorter. get method of dict has None as default value if key doesn't exists

def checker(fruit: str, number: int) -> bool:
    check_dict = {
        "apple": number > 3,
        "banana": number < 2,
        "watermelon": number > 10
    }
    res = check_dict.get(fruit)
    if res:
        return res

ans = checker(fruit="apple", number=4)
print(ans)

Upvotes: 0

Related Questions