Python使用条件值初始化字典



当我初始化check_dict时,所有的值(条件(都会被计算出来(变成布尔值(吗?如果是,如果我把condition作为字典的值,效率会不会很高?有更好的方法吗?

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)

为什么要构建字典?简单的if-else就足够了:

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:小型基准:

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)

打印:

0.10748997700284235
0.23576407400832977

你可以做得更短一点。如果密钥不存在,dict的get方法将None作为默认值

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)

如果checker函数打算被重复调用,并且可能结果列表更大,那么优化它的一种方法是将字典创建拉到checker函数之外,如下所示:

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)

最新更新