Home > Mobile >  Python initialize a dictionary with condition values
Python initialize a dictionary with condition values

Time:09-27

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)

CodePudding user response:

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

CodePudding user response:

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)

CodePudding user response:

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)
  • Related